Rustã§æ®éã«ããã°ã©ãã³ã°ããã ãã§MISRA-Cã®ã«ã¼ã«ã90%æºè¶³ã§ãã
ã¯ããã«
2019/2/10追è¨
è¨äºãæ¸ãã¦ããæ°ã¥ããã®ã§ãããæ£ç¢ºã«ã¯ãRustã®ã¢ããªãã¥ã¼ããããã¤ãè¨å®ããã°ãMISRA-Cã®ã«ã¼ã«ã90%æºè¶³ã§ããã§ããã
ç§ã¯MISRA-Cã®ã³ã¼ãã£ã³ã°è¦ç´ã§ããã°ã©ãã³ã°ãããã¨ããªããããå 容ã«èª¤ããããããããã¾ãããééã£ã¦ããç¹ãããã°ããææããã ããã¨ãããããã§ãã
å¾ããã¤ãéãã§ãããCè¨èªã貶ããæå³ã¯ä¸åããã¾ããã
æ¨æ¥ããtwitterã§ãRustãçµè¾¼ã¿ã®ã»ãã¥ãªãã£ãéè¦ãªåéã§åºã¾ãã¨è¯ããªããã¨ããè°è«ãããã¾ããã ãã®ä¸ã§ãè»è¼ã§ã¯ããã¯ãMISRAåºæºã¨ã®é¢ä¿ãæ確ã«ãªããã¨ãã¨ãããã¨ã1ã¤ã®åºæºã«ãªãããã§ããã
@hashaskell ãããããMISRAã³ã¼ãã£ã³ã°ã«ã¼ã«ã®ãã¡ãRustã³ã³ãã¤ã©ãã¢ããªãã¥ã¼ãã®è¨å®ãå«ãã¦ãä¿è¨¼ããã«ã¼ã«ã®ãªã¹ããä½æãã¦ããã¬ãã¸ããªãæãã¦é ãã¾ããã
çµæã®ãµããªãéè¨ããã¨ããã次ã®ãããªçµæã§ããã
status | ã«ã¼ã«æ° |
---|---|
ããã©ã«ãã§ã³ã³ãã¤ã©ã¨ã©ã¼ | 89 |
Cè¨èªç¹ææ©è½ã®ããã®ã«ã¼ã«ã§ãRustã«è©²å½æ©è½ããªããã®ã | 54 |
ããã©ã«ãã§ã³ã³ãã¤ã«ã¨ã©ã¼ã«ãªããªã | 35 |
ã¤ã¾ããRustã§ã³ã³ãã¤ã«ãéã£ãæç¹ã§ãMISRAã³ã¼ãã£ã³ã°åºæºã®80%ãæºããã¦ãããã¨ã«ãªãã¾ãã
Rustã使ãå§ãã¦ããã£ãã®ã¯ãC/C++ã§ã¯é·ãéããã¦ãã£ããå¦ãã§ãããããªãè¯ãæ¸ãæ¹ããå¦ã°ãªããã¨ã«ã¯ã Rustã§ã¯ããã°ã©ã ãã³ã³ãã¤ã«ãããã¨ããã§ããªããã¨ãããã¨ã ã
ããã°ã©ãã³ã°Rustãã
æ®ã35åã®ã«ã¼ã«ãæ°ã«ãªã£ãããã1ã¤ãã¤ãã®å 容ã確èªãã¾ããã
6åã¯ãRustã³ã³ãã¤ã©ã¾ãã¯clippyã®è¦åã§æ¤åºå¯è½ã§ãã 11åã¯ãRustã®è¨èªä»æ§ä¸ãåé¡ã«ãªããªãã¨èãããã¾ãï¼ç§ãããèãããã¨ããã ãã§ããï¼ã
ã¨ãããã¨ã§ãRustã®ã¢ããªãã¥ã¼ããè¨å®ããä¸ã§ãã³ã³ãã¤ã«ã§ããã³ã³ãã¤ã©ã®è¦åã¨clippyã®è¦åãä¿®æ£ããã¨ãMISRAã³ã¼ãã£ã³ã°åºæºã®90%ã¯æºãããã¨ã«ãªãã¾ãã
ã³ã³ãã¤ã©ã®è¦åã¨clippyã®è¦åãä¿®æ£ããã®ã¯ãå²ã¨æ®éã®Rustããã°ã©ãã³ã°ã®ç¯å²ã§ãã
ã©ããã¦ãé»ããããæãããã¾ãã
ã¨ããããã¨ã§ãRustããããï¼
æ¬è¨äºã®è¶£æ¨ã¯ä»¥ä¸ã§ãã
以ä¸ãã³ã³ãã¤ã«ã¨ã©ã¼ã«ã§ããªã35åã®ã«ã¼ã«ã1åãã¤è¦ã¦ãã£ãçµæã§ãã èå³ã®ããæ¹ã¯ã覧ãã ããã
MISRA-Rust
ããã©ã«ãã§ã³ã³ãã¤ã«ã¨ã©ã¼ã«ãªããªãä¾
MISRAã®ã«ã¼ã«ã¯ä¸ããå¼ç¨ãã¦ãã¾ãã
ã³ã¡ã³ã
3.1 ã/*ããã//ãã¨ããæåã®ä¸¦ã³ãã³ã¡ã³ãå ã§ä½¿ç¨ãã¦ã¯ãªããªã
ã©ãã§ãè¯ãããã§ããã
fn main() { /* /* Nested comment */ // Nested comment */ //~^ ERROR nested comments }
èå¥å
MISRAã®åºæ¬æ¹éãããèå¥åãåå©ç¨ããªãããªã®ã§ãRustããã®ãããã®ã«ã¼ã«ã«æºæ ããªãã®ã¯å½ç¶ã§ãã Rustã¯ã·ã£ãã¼ã¤ã³ã°ã許ãè¨èªã§ãããããã¯æ¬¡ã®ãããªå©ç¹ãããã¾ãã
- å¯å¤æ§ã®å¶å¾¡
- ä¸éå¤æ°
å¯å¤æ§ã®å¶å¾¡ã§ã¯ãããå¤æ°ãå¤æ´ä¸è¦ã«ãªã£ããã¨ãã³ã³ãã¤ã©ã«æãããã¨ãã§ãã¾ãã
let mut x = 10; /* We can modify x here. */ let x = x; /* We no longer modify x! */
ã¾ããå¦çãé£éãããããªå ´åãã·ã£ãã¼ã¤ã³ã°ã«ããã誤ã£ã¦ä¸éçµæã使ããã¨ããªããªãã¾ãã
let data = 0; let data = do_something(data); let data = do_another(data); let data = data.unwrap();
ã·ã£ãã¼ã¤ã³ã°ãã度ã«ããã®åã®data
ã«ã¯ã¢ã¯ã»ã¹ã§ããªããªãã¾ãã
ããã¯ãä¸æã«ä¸æå¤æ°ãä½ãããå®å
¨ã§ã¯ãªãã§ããããã
5.1 å¤é¨èå¥åã¯ç°ãªã£ããã®ã«ããªããã°ãªããªã
ãã¹ãã³ã¼ããããããæ°ããã¾ããå¤é¨ã«å ¬éããèå¥åãä¸æã«ãªãã°è¯ãæ°ããã¾ããâ¦ï¼
const ABC: i32 = 0; fn main() { let abc: i32 = 1; //~^ ERROR Non-compliant - variable name shadows ABC let _ = abc + ABC; }
5.2 åãã¹ã³ã¼ãã¨åå空éã§å®£è¨ãããèå¥åã¯ç°ãªã£ããã®ã«ããªããã°ãªããªã
å½ç¶ã·ã£ãã¼ã¤ã³ã°ãçºçãã¾ãã
fn main() { let engine_exhaust_gas_temperature_raw: i32 = 0; let engine_exhaust_gas_temperature_raw: i32 = 1; //~^ ERROR Non-compliant - variable name shadows engine_exhaust_gas_temperature_raw }
5.3 å å´ã®ã¹ã³ã¼ãã§å®£è¨ãããèå¥åã¯ãå¤å´ã®ã¹ã³ã¼ãã§å®£è¨ãããèå¥åãé ãã¦ã¯ãªããªã
ã¯ãã
fn main() { let i: i16 = 1; if true { let i: i16 = 0; //~ ERROR Non-compliant - `i` shadows outer scope. let _ = i; } let _ = i; }
ããããstatic
ãconst
ã®ã·ã£ãã¼ã¤ã³ã°ã¯ãã³ã³ãã¤ã«ã¨ã©ã¼ã«ãªãã¾ãã
static abc: i32 = 0; { let abc: i32 = 1; }
error[E0530]: let bindings cannot shadow statics | 4 | static abc: i32 = 0; | -------------------- the static `abc` is defined here 5 | { 6 | let abc: i32 = 1; | ^^^ cannot be named the same as a static
ãã®ãããã°ãã¼ãã«é åã«å®£è¨ããstaticå¤æ°ãå®æ°ã«ã¤ãã¦ã¯ãã·ã£ãã¼ã¤ã³ã°ããã¨ã³ã³ãã¤ã«ã¨ã©ã¼ã«ãªãã¾ãã é¢æ°ãã¼ã«ã«ã§ããã·ã£ãã¼ã¤ã³ã°èµ·ããªãï¼ï¼ï¼ã®ã§ããã£ããå®å ¨ãªæ°ããã¾ãã
5.4 ãã¯ãèå¥åã¯ç°ãªã£ããã®ã«ããªããã°ãªããªã
éããã§ãããæå¤ãã¡ããã¨unused macro definition
ã®è¦åã¯åºã¾ãã
macro_rules! engine_exhaust_gas_temperature_raw { () => { 3; }; } macro_rules! engine_exhaust_gas_temperature_raw { //~^ ERROR Non-compliant - variable name shadows engine_exhaust_gas_temperature_raw () => { 4; }; } fn main() { let _ = engine_exhaust_gas_temperature_raw!(); let _ = engine_exhaust_gas_temperature_raw!(); }
5.6 typedefåã¯ä¸æã®èå¥åã§ãªããã°ãªããªã
ã«ã¼ã«çã«ã¯ãé¢é£åã¨ãå ¨é¨ãã¡ã§ãããâ¦ã
fn main() { type U8 = bool; { type U8 = u8; //~^ ERROR Non-compliant - type name shadows U8 } }
ãªãã©ã«ã¨å®æ°
7.2 符å·ãªãã®åã§è¡¨ç¾ããã¦ãããã¹ã¦ã®æ´æ°å®æ°ã«ã¯ãuãã¾ãã¯ãUãæ¥å°¾èªãé©ç¨ããªããã°ãªããªã
fn main() { let compliant_unsigned: u32 = 1u32; let unsigned: u32 = 1; //~^ ERROR Non-compliant - suffix specifying unsigned type required on integer constants }
Cè¨èªã¨éã£ã¦ãä¸ã¯ã¡ããã¨ã¨ã©ã¼ã«ãªãã¾ãã
let unsigned: u32 = -1;
error[E0600]: cannot apply unary operator `-` to type `u32` | 2 | let unsigned: u32 = -1; | ^^ cannot apply unary operator `-` | = note: unsigned values cannot be negated
Cè¨èªã¯ãä¸ã®ã³ã¼ãã¯ã³ã³ãã¤ã«ãéã£ã¡ããã®ã§å¤§å¤ã§ãã
uint32_t u = -1;
7.4 ãªãã¸ã§ã¯ãã®åããconst修飾æåã¸ã®ãã¤ã³ã¿ãã§ãªãéããæååãªãã©ã«ããªãã¸ã§ã¯ãã«ä»£å ¥ãã¦ã¯ãªããªã
æ®éã«ã§ãã¡ããã¾ãããªã
fn main() { let mut _l = "string literal"; //~^ ERROR Non-compliant - string literal not const-qualified. }
宣è¨ã¨å®ç¾©
8.1 åã¯æ示çã«æå®ãããªããã°ãªããªã
ã¾ããåæ¨è«ããã¾ããããâ¦ããã ãå±ãªãæé»ã®åå¤æãèµ·ããªããããæ示çã«åãæ¸ãã¡ãªãããã»ã¨ãã©ããã¾ããã
fn main() { let x; //~^ ERROR Non-compliant - type not explicitly specified x = 1;
8.7 翻訳åä½å ã§ã®åç §ããã 1ã¤ã§ããå ´åãé¢æ°ããªãã¸ã§ã¯ãã¯å¤é¨ãªã³ã±ã¼ã¸ã使ç¨ãã¦å®ç¾©ãã¦ã¯ãããªã
ããã¯ãclippyããã§ãè¦åãåºãªãã£ãã§ãã
pub const LIBRARY_GLOBAL: u32 = 0; //~^ ERROR Non-compliant - public but not used
8.9 èå¥åãåä¸ã®é¢æ°å ã«ã®ã¿åºç¾ããå ´åããã®ãªãã¸ã§ã¯ãã¯ãããã¯ã¹ã³ã¼ãã§å®ç¾©ãããªããã°ãªããªã
ããããclippyããã§ãè¦ååºãªãã§ããã
const GLOBAL: u32 = 0; fn main() { let _x = GLOBAL + 1; //~^ ERROR Non-compliant - global only used at block scope }
8.13 ãã¤ã³ã¿ã¯å¯è½ãªéãconst修飾åãæããªããã°ãªããªã
ããã¯ãæ®ãã®ã³ã¼ãã§ä½¿ã£ã¦ããªããã°ãmut
å¤ããããã®è¦åãåºã¾ãã
let mut x: Box<u8> = Box::new(8); //~^ ERROR Non-compliant - "pointer" is not const-qualified.
å®è³ªçãªåã¢ãã«
10.1 ãªãã©ã³ããä¸é©åãªå®è³ªçãªåã§ãã£ã¦ã¯ãªããªã
ãã¹ãã³ã¼ããå¤ãªæ°ããã¾ããMISRAã¯æé»å¤æã®ãã¨ãè¨ã£ã¦ããã¨æãã®ã§ããâ¦ã
let x: i32 = 0xFF; let y = x << 2; //~^ ERROR Non-compliant - inappropriate essential type
CERT Cã®ä¼¼ãé
ç®ã«ãããä¸ãã¡ããã¨åãã°è¯ãã®ã§ã¯ï¼
Cè¨èªã§ã¯ã0x0a
ãæå¾
å¤ã§ãããæåã«æé»å¤æããã¦int32_tãããã«ãªãçµæã0xfa
ã«ãªãã¾ãã
uint8_t port = 0x5a; uint8_t result_8 = ( ~port ) >> 4;
Rustã§ã¯ãããã¯ã¡ããã¨0x0a
ã«ãªãã¾ãã4
ãu8
ã«åæ¨è«ããããã(ï¼)ã§ãããã
let x: u8 = 0x5a; let y = ( !x ) >> 4;
10.8 è¤åå¼ã®å¤ã¯ç°ãªãå®è³ªçãªååé¡ãããåºãå®è³ªçãªåã«ãã£ã¹ããã¦ã¯ãªããªã
ããããã¹ãã±ã¼ã¹ãããããæ°ããã¾ããâ¦ãè¤åå¼ã®ä¸ã§æçµçµæãã大ããåã«ãã£ã¹ãããã¦ã¯ãããªããã¨ããã«ã¼ã«ã£ã½ãã®ã§ããã
let x: u16 = 1; let y: u16 = 2; let _: u32 = (x + y) as u32; //~^ ERROR Non-compliant - composite cast to wider type
ä¸ã®ãããªã³ã¼ããéããªããã°è¯ãï¼ä¸ã¯ã³ã³ãã¤ã«ã¨ã©ã¼ã«ãªãã¾ãã
let x: u8 = 255; let y: u8 = (x + 1u16) as u8;
å¼
12.1 å¼ã®ä¸ã®æ¼ç®åã®åªå é ä½ã¯æç½ã§ãªããã°ãªããªã
ä¸ã¯ã³ã³ãã¤ã«ã¨ã©ã¼ã«ã¯ãªãã¾ãããclippyããã¯()
ãä»ããªãããã¨è¨ã£ã¦ããã¾ãã
let x: usize = 1; if x >= 2 << 2 + 1 as usize { //~^ ERROR Non-compliant - operator precedence can trip the unwary }
12.4 å®æ°å¼ã®è©ä¾¡ã¯ã符å·ãªãæ´æ°ã®ã©ããã¢ã©ã¦ã³ããå¼ãèµ·ããã¦ã¯ãªããªã
ã¸ã¼ããããã³ã³ãã¤ã«æã¯ãã¡ãªãã§ããã
let u8a: u8 = 0; let _x = u8a - 10; //~^ERROR Non-compliant - attempt to subtract with overflow
çãããåç¥ã®éããå®è¡æã¯å®ç¾©ããããããã¯ãçºçãã¾ãã
thread 'main' panicked at 'attempt to subtract with overflow', src/main.rs:3:14
å¯ä½ç¨
13.2 å¼ã®å¤ã¨ãã®æ°¸ç¶çãªå¯ä½ç¨ã¯ããã¹ã¦ã®è¨±å¯ãããè©ä¾¡é ã§åãã§ãªããã°ãªããªã
Rustã¯å¼ã®è©ä¾¡é 決ã¾ã£ã¦ãããã§ããâ¦ï¼ æ示çã«æ¸ãã¦ããããã¥ã¡ã³ãã¯è¦ã¤ãã£ã¦ãã¾ããããDocument function argument evaluation order (or lack thereof)ãªã©ãè¦ã¦ããå·¦ããå³ã¸è©ä¾¡ããã模æ§ã§ãã
ããã§ãªãã¨ãããã¼ãã§ãã«ããã¾ããã§ãã¯ã§ããªãæ°ããã¾ãã
/// This function has a side effect. fn increment(x: &mut u8) -> &mut u8 { *x += 1; x } /// This function does not have a side effect. fn add(x: u8, y: u8) -> u8 { x + y } fn main() { let mut x: u8 = 0; let _ = add(*increment(&mut x), x); //~ ERROR Non-compliant - evaluation order effects result }
13.5 &&ã||ã®è«çæ¼ç®åã®å³å´ã®ãªãã©ã³ãã¯ãæ°¸ç¶çãªå¯ä½ç¨ãå«ãã§ã¯ãªããªã
&&ã||ã¯ãç絡è©ä¾¡ãããã®ã§ãããã¯ããã¾ãããclippyãããå±ã£ã¦ãããªãã§ããã
/// This function has a side effect. fn not(x: &mut bool) -> &mut bool { *x = !*x; x } fn main() { let mut x: bool = true; if *not(&mut x) || *not(&mut x) { //~^ ERROR Non-compliant - right hand operand contains persistent side-effects } }
å¶å¾¡æã®å¼
14.1 ã«ã¼ãã«ã¦ã³ã¿ã¯ãå®è³ªçã«æµ®åå°æ°ç¹åãæã£ã¦ã¯ãããªã
ã«ã¼ãã«ã¦ã³ã¿æ±ã...ãªã®ããªï¼
let mut f: f64 = 0_f64; while f < 1.0 { f += 0.001_f64; //^ ERROR Non-compliant - loop counter with floating point type }
14.2 forã«ã¼ãã¯é©æ£ã«å®ç¾©ãããªããã°ãªããªã
ã³ã³ãã¤ã«ã¨ã©ã¼ã«ã¯ãªãã¾ãããããã®æ¸ãæ¹ã®å ´åãã«ã¼ãã®åæ°èªä½ã¯å¤åãã¾ããã100åãã£ã¡ãå¨ãã¾ãã
let mut bound: u32 = 100; for i in 0..bound { bound -= i; //~^ ERROR Non-compliant - attempt to mutate range bound within loop }
clippyããã以ä¸ã®è¦è¨ãåãã¦ããã¾ãã
warning: attempt to mutate range bound within loop; note that the range of the loop is unchanged | 6 | bound -= i; | ^^^^^^^^^^
ãã ããbound
ãéä¸ã§overflowããã®ã§ãå®è¡æã«å®ç¾©ããããããã¯ãçºçãã¾ãã
thread 'main' panicked at 'attempt to subtract with overflow', src/main.rs:7:9
14.3 å¶å¾¡å¼ã¯ä¸å¤ã§ãã£ã¦ã¯ãªããªã
æå¤ã¨ããå±ã£ã¦ããããªããã§ããâ¦ã
let a: i32 = 0; if (a < 10) && (a > 20) { //~^ ERROR Non-compliant - always true }
å¶å¾¡ããã¼
15.5 é¢æ°ã¯ããã®æå¾ã«1ã¤ã ãã®åºå£ãæããªããã°ãªããªã
ã¾ããããã¯ãâ¦ãå¿ é ã«ã¼ã«ã§ã¯ããã¾ãããããªã½ã¼ã¹è§£æ¾å¿ããé常ã¯çºçããªãã®ã§ãRustã§ã¯ã¬ã³ã¬ã³æ©æãªã¿ã¼ã³ããã°è¯ãã¨æãã¾ãã
let x = 1; if x > 1 { return; } if x < 1 { return; //~^ ERROR Non-compliant - more than one exit point from function }
15.7 ãã¹ã¦ã®if ... else ifæ§æã¯ãelseæã§çµäºããªããã°ãªããªã
clippyãããåå¿ãªãã
fn main() { let x = 1; if x == 2 { let _ = 1; } else if x == 3 { let _ = 2; } //~^ ERROR Non-compliant - no terminating `else` }
switchæ
16.6 ãã¹ã¦ã®switchæã¯ãå°ãªãã¨ã2ã¤ã®ã¹ã¤ããç¯ãæããªããã°ãªããªã
clippyãããåå¿ãªãã
let i = 1; match i { _ => {} //~ ERROR Non-compliant - less that two clauses }
16.7 ã¹ã¤ããå¼ã¯å®è³ªçã«ãã¼ã«åãæã£ã¦ã¯ãããªã
clippyãããããif/elseå¼ã«ããªããã¨ãå±ããåãã¾ãã
let i = true; match i as bool { //~^ ERROR Non-compliant - match on a boolean expression false => { let _ = 1; } _ => { let _ = 2; } }
é¢æ°
17.2 é¢æ°ã¯ãç´æ¥çã¾ãã¯éæ¥çã«ãèªåèªèº«ãå¼ã³åºãã¯ãããªã
ããã ã£ããå帰å¼åºãç¦æ¢ãªãã§ãããâ¦ã
17.7 void以å¤ã®æ»ãå¤ã®åãæã¤é¢æ°ãè¿ãå¤ã¯ä½¿ç¨ãããªããã°ãªããªã
_
ã§æ¨ã¦ãã³ã¼ããæ¸ãã°è¯ãã ããªã®ã§ãããããã«æå³ãããããã¨ãã話ã§ã¯ããã¾ããã
Resultåã¯ä½¿ããªãã¨è¦ååºã¾ãã
fn func(para1: u16) -> u16 { para1 } fn discarded(para2: u16) { func(para2); //~^ ERROR Non-compliant - `func` return discarded } fn main() { discarded(1); }
17.8 é¢æ°ãã©ã¡ã¼ã¿ãå¤æ´ãã¦ã¯ãããªã
Rustã§ãããªã³ã¼ãæ¸ãäººå± ãã®ããªâ¦ã¨ããæ°æã¡ã«ãªããªããããã³ã³ãã¤ã«ã¨ã©ã¼ã«ã¯ãªãã¾ããã
fn paramod(mut para: u16) -> u16 { para += 1; //~ ERROR parameter modified without persistent effect let _ = para; 1 } fn main() { paramod(1); }
ãã¤ã³ã¿ã¨é å
18.5 2段éãè¶ ããå ¥ãåã®ãã¤ã³ã¿ã宣è¨ãã¦ã¯ãããªã
ãããclippyããã®è¦åãé¢ç½ãã§ãã
fn nesting(p: &&&&&&[u8; 10]) { let _ = ****p; } fn main() { let a = [5; 10]; nesting(&&&&&&a); //~^ ERROR Non-compliant - reference nesting exceeds maximum allowed }
warning: this argument is passed by reference, but would be more efficient if passed by value | 1 | fn nesting(p: &&&&&&[u8; 10]) { | ^^^^^^^^^^^^^^ help: consider passing by value instead: `&&&&&[u8; 10]`
1åæ¸ãããã¨ã®ãã¨ã§ããã¡ãªã¿ã«&
ã1åã«ãªãã¾ã§ãæ°¸é ã«1åæ¸ãããã¨è¨ããã¾ããã¦ã±ãã
éãªãåãè¨æ¶å
19.2 unionãã¼ã¯ã¼ãã使ç¨ãã¦ã¯ãªããªã
使ãã¾ãããunsafe
ã§ãã
union UnionA { f1: i16, f2: i32, } fn main() { let mut u = UnionA { f2: 0 }; unsafe { u.f1 = u.f2 as i16 }; //~^ ERROR mismatched types }
åå¦çæ令
20.1 #includeæ令ã«å¯¾ãã¦ã¯ãä»ã®åå¦çæ令ãã³ã¡ã³ãã®ã¿ãå è¡ããã
#include
ã¨éã£ã¦ãuse
ã¯é çªã«ä¾åããªãã®ã§ãã¡ãã£ã¨è©±ãå¥ãªæ°ããã¾ãã
struct MyStruct { a: u32, } fn func(_: MyStruct) {} use std::fmt; //~ ERROR Non-compliant - `include` directive preceeded by something other than macros or comments impl fmt::Display for MyStruct { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "MyStruct{{ {} }}", self.a) } } fn main() { let s = MyStruct { a: 10 }; func(s); }
20.2 ã'ããã"ãã¾ãã¯ã\ãæåãã/*ãã¾ãã¯ã//ãæååãããããã¡ã¤ã«åã«åå¨ãã¦ã¯ãªããªã
ããå¦çã§ãããã§ãããããããããããã¡ã¤ã«ããªãã®ã§â¦ã
include!("../../include/_'_.rs"); //~ ERROR invalid character `'` in crate name: `Rule_20_2_'` fn main() {}
æ¨æºã©ã¤ãã©ãª
21.1 äºç´æ¸ã¿èå¥åãäºç´æ¸ã¿ãã¯ãåã«å¯¾ãã¦#defineã#undefã使ç¨ãã¦ã¯ãªããªã
println
ã£ã¦äºç´æ¸ã¿ãã¯ããªãã§ããããâ¦ï¼
macro_rules! println { //~ ERROR Non-compliant - redefinition of macro name () => { 3; }; } fn main() { println!(); }
21.2 äºç´æ¸ã¿èå¥åã¾ãã¯ãã¯ãåã宣è¨ãã¦ã¯ãªããªã
21.1ã¨åãã§ãã