[问题] strcpy memcpy strncpy 风险问题

楼主: gn00618777 (非常念旧)   2020-09-19 09:53:15
网络上介绍 strcpy strcmp 这些相关function有些风险,就是可能会造成 memory
越界问题。所以使用 strncpy strncmp 这些来替代。
原因是strcmp(a,b),b若没有空字符结尾,他会一直比下去,会有存取到未知memory
风险。所以用strncmp代替。
现在我开发nRF5 BLE 相关系列。BLE底层callback回来有 uint8_t *p_data 和长度。
我从APP传过去是一个 device name,callback接收到后只会是hex byte由 p_data指向
请问你们把它存成字串会是怎样的安全作法?
1 在BLE内先宣告长度20的阵列。array[0]= p_data
array[1]= p_data+1
..
array[18] = p_data+18
array[19] = '\0'
2 memcpy(array, p_data, sizeof(array));
第二种我不确定安不安全。假设p_data没有到20那么长,不就也会把p_data指向的
memory越界了吗?
请多多指教QQ
作者: CoNsTaR ((const *))   2020-09-19 10:59:00
所以你才会需要 dependent types 啊?不过 cpp 的话放弃吧,不会有 dependent types 的 orz
作者: Lipraxde (Lipraxde)   2020-09-19 11:20:00
你要先知道 device name 最常能到多长,或是自己决定,太长就当掉。不然就是改用 malloc 的方式
作者: b0920075 (Void)   2020-09-19 12:37:00
把你要用的区域先初始化为0,确定复制字串的范围不要超出大小就好了吧
作者: CoNsTaR ((const *))   2020-09-19 18:29:00
这很明显就是须要 dependent types 啊,除了 dependent types(或静态分析,如果阵列长度是编译期确定的话)以外还有什么方法可以在不改变 callback 实作的条件下确保没有 out of bound access?不过如果你信任 callback 不会乱来的话,就用 malloc +清零的方式吧
作者: Lipraxde (Lipraxde)   2020-09-19 18:52:00
诶... callback 不是他自己写吗?还是我误会了?OuO
作者: james732 (好人超)   2020-09-19 20:25:00
话说对array取sizeof是有点危险的
作者: Schottky (顺风相送)   2020-09-19 20:58:00
strcmp 状况不一样,并不会有风险,比对到不同就停了strncmp 只是用在你只想比前 N 个字符的状况那个 N 值并不适合用来做边界限制
作者: b0920075 (Void)   2020-09-20 11:01:00
硬要说的话 strcmp 会有 side channel attack ,也不是多安全就是了
作者: CoNsTaR ((const *))   2020-09-20 13:48:00
strcmp 如果两个字串相同而且都没有结尾还是不安全吧?
作者: LPH66 (-6.2598534e+18f)   2020-09-21 18:46:00
那这就是不符合 strcmp 的要求的参数了 -- strcmp 是比较null-terminated string 的, 不是这样的字串不能用cppref 上是写若指标不是指向此种字串则是 UB也就是说: 很遗憾的, 又是个容易写得出来的 UB
作者: CoNsTaR ((const *))   2020-09-22 01:07:00
不过说实在的,标准写得再严格,它 type 就是长那样标准说不允许的东西就是随便都能造得出来要是文件、标准真的有用,干嘛不通通写文件就好了,还写程式干嘛 XD
作者: loveme00835 (发箍)   2020-09-23 05:54:00
写希佳佳分为两种人: 追随标准的人; 还有制定标准的人. 标准某种程度上来说反映了当代技术的水平, 还有写码习惯. 一个人如果明白语言定义的 abstract machine 和 physical machine 的差异以及设计目的, 那写码就会更有可携性, 也更安全.
楼主: gn00618777 (非常念旧)   2020-09-23 21:53:00
回某楼callback是BLE software ,是一个沙盒无法动我目前就是用既定大小的空间,先初始为0,并确保来的p_data大小不超过既定范围
作者: Lipraxde (Lipraxde)   2020-09-24 01:45:00
虽然,还是不太懂你写的是哪边的程式,但是反正只要确保自己写的程式是 OK 的,行有余力再考虑怎么避免其他人写出有问题的就好。
作者: CoNsTaR ((const *))   2020-09-24 05:50:00
"abstract machine 和 physical machine" is a fancy wayof saying semantics lol, people who invented that should definitely get a nobel in literature imoAnd yeah that's exactly what I was taking about. Instead of having your types (which is the ACTUAL programthat you compile) correct, you choose to have your documents (which is a part of std) correct. I honestlykinda don't see how this whole "praising std" thingwould work, but I'll take your words for that beforeI finally figure it out. I mean, if I could.

Links booklink

Contact Us: admin [ a t ] ucptt.com