我正在编写一个 C 程序,需要显示整数数组的字节值。这是我正在使用的代码:
#include <stdio.h>
int main(void)
{
int arr[] = {67305985, 134678021, 202050057};
unsigned char *byte_ptr = NULL;
byte_ptr = (unsigned char *)arr;
for (size_t i = 0; i < sizeof(arr); i++)
printf("%u ", *(byte_ptr + i)); // <- 2nd function call argument is an uninitialized value
return 0;
}
or
#include <stdio.h>
int main(void)
{
int arr[] = {67305985, 134678021, 202050057};
unsigned char *byte_ptr = NULL;
byte_ptr = (unsigned char *)arr;
for (size_t i = 0; i < sizeof(arr); i++)
{
unsigned char value = *(byte_ptr + i);
if (value >= 4 && value <= 7)
printf("%p ", (byte_ptr + i));
}
return 0;
}
在此代码中,我将指针 byte_ptr 初始化为数组 arr 的开头。然后,在循环中,我使用指针算术来访问数组的每个字节并打印其值。
但是,我的静态分析器在 printf 调用行上给出了一个错误,指出第二个函数调用参数是未初始化的值。这让我很困惑,因为 byte_ptr 被初始化为指向 arr,而我只访问 arr 范围内的字节。
任何人都可以帮助我理解为什么会出现此错误以及如何修复它?预先感谢!
我不确定这个静态分析器是什么,我目前正在使用一台检查大学系统的机器,它输出如下内容:
以下是命令:
cppcheck --std=c11 --enable=all --xml-version=2 --error-exitcode=42 --includes-file=/usr/include --suppress=missingIncludeSystem --suppress=variableScope --suppress =unmatchedSuppression 10.9_jak_przechowana_jest_tablica_w_pamieci.c
cppcheck-htmlreport --file=cppcheck_log.xml --title=abc --report-dir=cppcheck --source-dir=./ --source-encoding=utf-8
扫描构建-o。 -stats -internal-stats --force-analyze-debug-code --keep-empty --status-bugs -o ./clang_tmp -enable-checker alpha.core.CastSize -enable-checker alpha.core.CastToStruct -enable -checker alpha.core.FixedAddr -enable-checker alpha.core.IdenticalExpr -enable-checker alpha.core.PointerArithm -enable-checker alpha.core.PointerSub -enable-checker alpha.core.SizeofPtr -enable-checker alpha.deadcode .UnreachableCode -enable-checker alpha.security.ArrayBound -enable-checker alpha.security.ArrayBoundV2 -enable-checker alpha.security.ReturnPtrRange -enable-checker alpha.unix.Chroot -enable-checker alpha.unix.SimpleStream -enable-检查器 alpha.unix.Stream -启用检查器 alpha.unix.cstring.BufferOverlap -启用检查器 alpha.unix.cstring.NotNullTermulated gcc -ggdb3 -O0 -Wall -Wextra -std=c11 -xc -D_GNU_SOURCE -c 10.9_jak_przechowana_jest_tablica_w_pamieci。
Cppcheck:未发现错误/提示;下载报告
Clang:发现错误/提示;下载报告
printf("%u ", *(byte_ptr + i)); // <- 2nd function call argument is an uninitialized value
是静态分析器的 误报。
代码依赖别名来了解
byte_ptr
指向初始化数据。
如果
byte_ptr
是 short *
,那就是 UB,但没关系,因为 byte_ptr
指向单字节类型,并且是抗锯齿规则的例外。
研究别名规则以获取更多详细信息。