工具/软件:TI C/C++编译器
如果我有以下代码
extern unsigned char __heap[512]; #define MID ((void *)_heap + 256) #define end (((void *)_heap + 512) void func (void) { void *ptr =结束; 执行{ *(unsigned char *) ptr = 1; ptr -= 32; } while (ptr > MID); }
我获得有关 void 指针算术的可接受警告、但生成的代码在所有优化级别下都不正确。
在 opt_level=0下、我得到以下结果:
;** 9--- ptr =&_heap+512; .dwpsn 文件"ptrloop.c"、行9、列15、is_stmt、ISA 0 MOV.W #_heap+512、R15 ;[]|9| ;*------------------------------------------------------- * ;*开始循环$C$L1 ;* ;*循环源代码行 :10 ;*循环右括号源行:13 ;*已知最小循环计数 :1 ;*已知最大行程计数 :4294967295 ;*已知最大行程计数因子 :1 ;*-------------------------------------------------------- * $C$L1: ;**--- G2: ;** 11 ---------------- *(unsigned char *) ptr = 1U; .dwpsn 文件"ptrloop.c"、行11、列9、is_stmt、ISA 0 MOV.B 1、0 (R15) ;[]|11| ;** 13----- 如果(ptr -= 32)>&_heap)转至 G2; .dwpsn 文件"ptrloop.c"、行13、列14、is_stmt、ISA 0 低于 W #32、R15 ;[]|13| CMP.W #_heap+1、R15 ;[]|13| JHS $C$L1 ;[]|13| ;[]|13| ;** ------------ 返回;
您可以看到、`与`_heap+1`而不是`_heap+257进行比较。
在 opt_level=4下、我得到以下结果:
MOV.W #_heap+512、R15 ;[]|9| ;** ------------ #pragma MUST_ITERATE (16、16、16) ;** ------------ #pragma LOOP_FLAGS (0U) ;** ------------ L$1 = 16; MOV.W #16、r14 ;[];*---- ------------------------------------------------------ * ;*开始循环$C$L1 ;* ;*循环源代码行 :10 ;*循环右括号源行:13 ;*已知最小循环计数 :16 ;*已知最大行程计数 :16 ;*已知最大行程计数因子 :16 ;*---------------------------------------------------------- * $C$L1: ;**--- G2: ;** 11 ---------------- *(unsigned char *) ptr = 1U; .dwpsn 文件"ptrloop.c"、行11、列9、is_stmt、ISA 0 MOV.B 1、0 (R15) ;[]|11| ;** 13----- ptr -= 32; .dwpsn 文件"ptrloop.c"、行13、列14、is_stmt、ISA 0 低于 W #32、R15 ;[]|13| ;** 13------------ 如果(L$1 = L$1-1)转至 G2; 低于 W 1、r14 ;[]|13| JNE $C$L1 ;[]|13| ;[]|13| ;** ------------ 返回;
您可以看到循环运行16次、其中循环应该只运行8。
根据我可以得出的结论、如果将 void 指针算术的结果存储在比较中、就不会有问题。 这应该被修复、否则、void 指针算术警告应该被更改为一个错误。