# 卒研経過報告 #6 Rustによる組み込みプログラミング マイコンWio terminalを用いたRustとC言語の信頼性,安全性の比較検証、考察 [先週のメモ](https://hackmd.io/@Fteam/H1HiKjcVF) ## 研究の目的 この研究ではこれまで主に組込みソフトウエア開発に使われてきたC/C++と それに替わる有効な選択肢として、注目されているRust言語との 信頼性や安全性など様々な面から比較検証を行う。 ## memo C言語だと危険な共有書き込みの具体例とrustによる解決例 ## 検証 ### C言語の脆弱性 - 未定義動作二つの文字列の重なり strcpy()関数は文字列を末尾のヌルバイト'\0'も含めてバッファーにコピーする. ```c= #include <stdio.h> #include <string.h> int main(void){ char str1[10] = "Hello!"; strcpy(str1+1, str1); printf("str1:%s\n", str1); } ``` ``` str1:HHello! ``` ```c= #include <stdio.h> #include <string.h> int main(void){ char str1[] = "ABCDEF"; char str2[] = "123456"; memcpy(str1, str2, 3); printf("%s\n", str1); return 0; } ``` ``` 123DEF ``` いま取り上げたstrcpy(),memcpy()関数はコピーするとき領域が重なっていた場合その動作は保証されない(らしい) コンパイラによっては期待通り動作しないこともありうる ```c= #include <stdio.h> #include <string.h> int main(void){ char str[] = "Hello World!"; printf("before:%s\n",str); memmove(str+5, str, 5); printf("after:%s\n",str); return 0; } ``` ``` before:Hello World! after:HelloHellod! ``` memmove()では正しくコピーできる 領域の重複があっても動作が保証される(らしい) ではrustではどうなるのか. ### rustのコンパイラでの動作 ```rust= fn main(){ let mut msg = String::from("My name is Koyasu."); let msg2 = &msg[8..msg.len()]; msg = msg2.to_string();//スライスが参照するデータの代入 println!("msg:{}", msg); } ``` ``` msg:is Koyasu. ``` 参照するデータの代入を行うスライスを用いた例 rustで重複コピーした際にcの例のように一部を重複させる方法を実現できていない ## 参考文献 [1] rustプログラミング入門 オーム社 [2] プログラミングrust [](https://support.microfocus.co.jp/SupportInf/asq_faqpublic.aspx?ML01001) [](http://www9.plala.or.jp/sgwr-t/lib/memmove.html)