一个困扰好久的bug
今天无聊发现一个int32_t实际只会出现uint8_t范围内的数值,就把类型改了,结果触发了一连串seg fault
然后就发现了一串明明没malloc就往里嗯写的野指针
真是喜欢C这个语言,给人一种碰了就别想活的感觉
Conversation
Notices
-
Embed this notice
Soybean (soybean@mastodon.ktachibana.party)'s status on Sunday, 09-Jun-2024 21:20:27 JST Soybean -
Embed this notice
Soybean (soybean@mastodon.ktachibana.party)'s status on Sunday, 09-Jun-2024 21:20:26 JST Soybean @coelacanthus 我这次的问题是涉及到硬件SRAM来回memcpy,所以好几个操作是malloc一个固定大小的,然而被malloc的struct并没有被检查大小
抄gayhub的野代码结果抄来了野指针,也算是报应(
*转指针一般union{uint8_t a[4], uint32_t b},直接shift指针位置感觉慌慌的,尤其是shift一个变量 -
Embed this notice
Roy Tam (roytam1@miniwa.moe)'s status on Sunday, 09-Jun-2024 21:20:26 JST Roy Tam @Soybean @coelacanthus 其實還有data alignment的問題,把32bit int換成8bit int不一定能減少內存的使用空間。 -
Embed this notice
Coelacanthus :archlinux: 🏳️⚧️ (coelacanthus@mastodon.yuuta.moe)'s status on Sunday, 09-Jun-2024 21:20:27 JST Coelacanthus :archlinux: 🏳️⚧️ @Soybean 感觉可能是什么地方在各种转指针导致算到了一个不存在的地址。比如 int64_t a[8]; b = (void*)a; c = (int64_t*)b; d = c + 7; 然后把定义 a 的地方改成 int8_t,因为 int64_t 是 int8_t 的八倍大小所以 d 就指向了一段未分配的内存。
-
Embed this notice