检测指针添加值与指针基本大小不匹配的情况。只能添加基本大小的字面量。此外,基数大小的乘积也不能相加。
理由在CODESYS 中(与 C 和 C++ 不同),当添加一个带有整数值的指针时,只会将该整数值添加为字节数,而不会将整数值乘以基大小。ST 中的例子:
pINT := ADR(array_of_int[0]) pINT := pINT + 2 ; // In CODESYS, pINT then points to array_of_int[1]
这段代码在 C 语言中的功能会有所不同:
short* pShort pShort = &(array_of_short[0]) pShort = pShort + 2; // In C, pShort then points to array_of_short[2]
因此,在CODESYS 中,应始终将指针的基大小的倍数加到指针上。否则,指针可能会指向非对齐内存,这(取决于处理器)会导致访问内存时出现对齐异常。
重要性:高
示例
VAR pudiTest:POINTER TO UDINT; udiTest:UDINT; prTest:POINTER TO REAL; rTest:REAL; END_VAR pudiTest := ADR(udiTest) + 4; // OK pudiTest := ADR(udiTest) + ( 2 + 2 ); // OK pudiTest := ADR(udiTest) + SIZEOF(UDINT); // OK pudiTest := ADR(udiTest) + 3; // SA0065 pudiTest := ADR(udiTest) + 2*SIZEOF(UDINT); // SA0065 pudiTest := ADR(udiTest) + ( 3 + 2 ); // SA0065 prTest := ADR(rTest); prTest := prTest + 4; // OK prTest := prTest + ( 2 + 2 ); // OK prTest := prTest + SIZEOF(REAL); // OK prTest := prTest + 1; // SA0065 prTest := prTest + 2; // SA0065 prTest := prTest + 3; // SA0065 prTest := prTest + ( SIZEOF(REAL) - 1 ); // SA0065 prTest := prTest + ( 1 + 4 ); // SA0065 --> SA0065: Incorrect pointer addition to base size