C 中通过指针运算访问数组字节时出现未初始化值错误

问题描述 投票:0回答:1

我正在编写一个 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;
}
  • %hhu 或 %u - 不会改变任何东西

在此代码中,我将指针 byte_ptr 初始化为数组 arr 的开头。然后,在循环中,我使用指针算术来访问数组的每个字节并打印其值。

但是,我的静态分析器在 printf 调用行上给出了一个错误,指出第二个函数调用参数是未初始化的值。这让我很困惑,因为 byte_ptr 被初始化为指向 arr,而我只访问 arr 范围内的字节。

任何人都可以帮助我理解为什么会出现此错误以及如何修复它?预先感谢!

我不确定这个静态分析器是什么,我目前正在使用一台检查大学系统的机器,它输出如下内容:

以下是命令:

  1. 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

  2. cppcheck-htmlreport --file=cppcheck_log.xml --title=abc --report-dir=cppcheck --source-dir=./ --source-encoding=utf-8

  3. 扫描构建-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 指针将其打印出来。
arrays c for-loop pointers printf
1个回答
0
投票

printf("%u ", *(byte_ptr + i)); // <- 2nd function call argument is an uninitialized value
是静态分析器的 误报

代码依赖别名来了解

byte_ptr
指向初始化数据。

如果

byte_ptr
short *
,那就是 UB,但没关系,因为
byte_ptr
指向单字节类型,并且是抗锯齿规则的例外。

研究别名规则以获取更多详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.