Stlink: 从开发分支构建错误,cpuid 问题

创建于 2020-04-20  ·  7评论  ·  资料来源: stlink-org/stlink

我尝试构建提交 c7874f805c63c60285f2b190f6589da8ae5e47fa
它因以下错误而失败:

/builddir/build/BUILD/stlink-org-stlink-c7874f8/tests/usb.c: In function 'main':
/builddir/build/BUILD/stlink-org-stlink-c7874f8/tests/usb.c:34:9: error: 'cpuid.revision' may be used uninitialized in this func
tion [-Werror=maybe-uninitialized]
   34 |         printf("cpuid:part = %#x, rev = %#x\n", cpuid.part, cpuid.revision);
      |         ^
/builddir/build/BUILD/stlink-org-stlink-c7874f8/tests/usb.c:31:27: note: 'cpuid.revision' was declared here
   31 |         cortex_m3_cpuid_t cpuid;
      |                           ^
/builddir/build/BUILD/stlink-org-stlink-c7874f8/tests/usb.c:34:9: error: 'cpuid.part' may be used uninitialized in this function [-Werror=maybe-uninitialized]
   34 |         printf("cpuid:part = %#x, rev = %#x\n", cpuid.part, cpuid.revision);
      |         ^
/builddir/build/BUILD/stlink-org-stlink-c7874f8/tests/usb.c:31:27: note: 'cpuid.part' was declared here
   31 |         cortex_m3_cpuid_t cpuid;
      |                           ^
/builddir/build/BUILD/stlink-org-stlink-c7874f8/tests/usb.c:33:9: error: 'cpuid.variant' may be used uninitialized in this function [-Werror=maybe-uninitialized]
   33 |         printf("cpuid:impl_id = %0#x, variant = %#x\n", cpuid.implementer_id, cpuid.variant);
      |         ^
/builddir/build/BUILD/stlink-org-stlink-c7874f8/tests/usb.c:31:27: note: 'cpuid.variant' was declared here
   31 |         cortex_m3_cpuid_t cpuid;
      |                           ^
/builddir/build/BUILD/stlink-org-stlink-c7874f8/tests/usb.c:33:9: error: 'cpuid.implementer_id' may be used uninitialized in this function [-Werror=maybe-uninitialized]
   33 |         printf("cpuid:impl_id = %0#x, variant = %#x\n", cpuid.implementer_id, cpuid.variant);
      |         ^
/builddir/build/BUILD/stlink-org-stlink-c7874f8/tests/usb.c:31:27: note: 'cpuid.implementer_id' was declared here
   31 |         cortex_m3_cpuid_t cpuid;
      |                           ^
lto1: all warnings being treated as errors

如何修复?

bucompilation bufixed errocompilation olinux staturesolved

所有7条评论

在 macOS 上,代码构建良好。

src/common.c

int stlink_cpu_id(stlink_t *sl, cortex_m3_cpuid_t *cpuid) {
    uint32_t raw;

    if (stlink_read_debug32(sl, STLINK_REG_CM3_CPUID, &raw))
        return -1;

    cpuid->implementer_id = (raw >> 24) & 0x7f;
    cpuid->variant = (raw >> 20) & 0xf;
    cpuid->part = (raw >> 4) & 0xfff;
    cpuid->revision = raw & 0xf;
    return 0;
}

看来cpuid.part和cpuid.revision确实是在这里初始化的。 也许编译器行为不端?

    if (stlink_read_debug32(sl, STLINK_REG_CM3_CPUID, &raw))
        return -1;

在这种情况下 cpuid.* 保持未初始化。

在 Ubuntu 上也成功编译。 变量cpuid在错误读取寄存器的情况下可以使用uninited。

--- a/tests/usb.c
+++ b/tests/usb.c
@@ -29,7 +29,11 @@ int main(int ac, char** av) {
printf("-- core_id: %#x\n", sl->core_id);

     cortex_m3_cpuid_t cpuid;

- stlink_cpu_id(sl, &cpuid);
+ if (stlink_cpu_id(sl, &cpuid))
+ {
+ printf("未知芯片\n");
+ memset(&cpuid, 0, sizeof(cortex_m3_cpuid_t))
+ }
printf("cpuid:impl_id = %0#x, 变量 = %#x\n", cpuid.implementer_id, cpuid.variant);
printf("cpuid:part = %#x, rev = %#x\n", cpuid.part, cpuid.revision);

我认为可以通过在 stlink_cpu_id 上添加返回值检查并将这些值初始化为零来修复它。 我会试试看。

我有-Werror=maybe-uninitialized因为在配置期间:

-- Performing Test C_SUPPORTS_WMAYBE_UNINITIALIZED
-- Performing Test C_SUPPORTS_WMAYBE_UNINITIALIZED - Success

@Vascom你可以测试我的分支https://github.com/chenguokai/stlink/tree/issue937吗?
如果有效,我会提出一个 PR。

@Vascom你可以测试我的分支https://github.com/chenguokai/stlink/tree/issue937吗?
如果有效,我会提出一个 PR。

是的,它有效。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

grzegorz-kraszewski picture grzegorz-kraszewski  ·  9评论

renn0xtek9 picture renn0xtek9  ·  8评论

bolorkhuu picture bolorkhuu  ·  11评论

tabemann picture tabemann  ·  5评论

yosoufe picture yosoufe  ·  12评论