Saya mencoba membangun komit c7874f805c63c60285f2b190f6589da8ae5e47fa
Dan itu gagal dengan kesalahan ini:
/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
Bagaimana itu bisa diperbaiki?
Di macOS, kode dibangun dengan baik.
Di 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;
}
Tampaknya cpuid.part dan cpuid.revision memang diinisialisasi di sini. Mungkin kompiler berperilaku buruk?
if (stlink_read_debug32(sl, STLINK_REG_CM3_CPUID, &raw))
return -1;
Dalam hal ini cpuid.* tetap tidak diinisialisasi.
Di Ubuntu berhasil dikompilasi juga. Variabel cpuid dapat digunakan uninited dalam kasus kesalahan membaca register.
--- a/tes/usb.c
+++ b/tes/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);
+ jika (stlink_cpu_id(sl, &cpuid))
+ {
+ printf("chip tidak diketahui\n");
+ memset(&cpuid, 0, sizeof(cortex_m3_cpuid_t))
+ }
printf("cpuid:impl_id = %0#x, varian = %#x\n", cpuid.implementer_id, cpuid.variant);
printf("cpuid:bagian = %#x, rev = %#x\n", cpuid.part, cpuid.revisi);
Saya pikir itu bisa diperbaiki dengan menambahkan pemeriksaan nilai kembali pada stlink_cpu_id dan menginisialisasi nilai-nilai itu ke nol. Saya akan mencobanya.
Saya punya -Werror=maybe-uninitialized
karena selama konfigurasi:
-- Performing Test C_SUPPORTS_WMAYBE_UNINITIALIZED
-- Performing Test C_SUPPORTS_WMAYBE_UNINITIALIZED - Success
@Vascom Bolehkah Anda menguji cabang saya https://github.com/chenguokai/stlink/tree/issue937 ?
Jika berhasil, saya akan menaikkan PR.
@Vascom Bolehkah Anda menguji cabang saya https://github.com/chenguokai/stlink/tree/issue937 ?
Jika berhasil, saya akan menaikkan PR.
Ya, itu berhasil.