Cast qualifier warning on Windows LLVM clang 16 with CMake FetchContent
维护者通常 12 天内回复
还没有人认领这个 Issue。
评估
- 难度
- 2/5
- 预计耗时
- 1-3 小时
- 新手友好度
- 42/100
- Issue 类型
- 缺陷
- 描述清晰度
- 描述清楚
- 活跃度
- 停滞
- 技术栈
- c, cmake
调研方向
检查 cJSON.c 中 cast_away_const() helper 附近及其周围的诊断 pragma。使用 Windows 上的 LLVM clang 16 重现报告中的 CMake FetchContent 构建,然后验证 cast-qualifier 警告不再导致构建失败,同时现有的 cJSON 行为保持不变。
由索引模型根据 Issue 内容生成。
描述
Hi,
I'm compiling cJSON using CMake FetchContent with LLVM clang 16 on Windows:
> clang.exe --version
clang version 16.0.0
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: C:\LLVM\bin
This results in a compile warning because it seems to inherit the high warning levels of my parent project:
C:\LLVM\bin\clang.exe -DCJSON_API_VISIBILITY -DCJSON_EXPORT_SYMBOLS -DENABLE_LOCALES -std=c89 -pedantic -Wall -Wextra -Werror -Wstrict-prototypes -Wwrite-strings -Wshadow -Winit-self -Wcast-align -Wformat=2 -Wmissing-prototypes -Wstrict-overflow=2 -Wcast-qual -Wundef -Wswitch-default -Wconversion -Wc++-compat -fstack-protector-strong -Wcomma -Wdouble-promotion -Wparentheses -Wunused-macros -Wmissing-variable-declarations -Wused-but-marked-unused -Wswitch-enum -fvisibility=hidden -O0 -D_DEBUG -D_DLL -D_MT -Xclang --dependent-lib=msvcrtd -g -Xclang -gcodeview -MD -MT _deps/cjson-build/CMakeFiles/cjson.dir/cJSON.c.obj -MF _deps\cjson-build\CMakeFiles\cjson.dir\cJSON.c.obj.d -o _deps/cjson-build/CMakeFiles/cjson.dir/cJSON.c.obj -c C:/src/project/build/ninja/Debug/_deps/cjson-src/cJSON.c
C:/src/project/build/ninja/Debug/_deps/cjson-src/cJSON.c:2022:19: error: cast from 'const void *' to 'void *' drops const qualifier [-Werror,-Wcast-qual]
return (void*)string;
^
1 error generated.
I can of course suppress warnings in cJSON from my parent project, so this is a very minor issue, but if you'd like to address it anyway in the cJSON source, then either of the changes in the patch seems to work for me:
diff --git a/cJSON.c b/cJSON.c
index 61483d9..b3e4ac4 100644
--- a/cJSON.c
+++ b/cJSON.c
@@ -2012,14 +2012,12 @@ CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON *array, cJSON *item)
#if defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))))
#pragma GCC diagnostic push
-#endif
-#ifdef __GNUC__
-#pragma GCC diagnostic ignored "-Wcast-qual"
+ #pragma GCC diagnostic ignored "-Wcast-qual"
#endif
/* helper function to cast away const */
static void* cast_away_const(const void* string)
{
- return (void*)string;
+ return (void*)(uintptr_t)string;
}
#if defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))))
#pragma GCC diagnostic pop
Evidently LLVM clang 16 does not define __GNUC__:
> C:\apps\LLVM\bin\clang.exe -dM -E -x c NUL | grep __G
#define __GCC_ASM_FLAG_OUTPUTS__ 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1
So having different #ifdef blocks for the diagnostic sections around the cast_away_const() function isn't having the desired effect in this case, but it seems like it should be safe to combine them, which works since __clang__ is defined.
On the other hand, potentially you could get rid of the preprocessor wrappers around this function and just do an intermediate cast to uintptr_t as demonstrated in the above patch to avoid the cast qualifier warning.
Of course if you don't care to change this at all, that's fine too.
Thanks,
Benbuck
- 主要语言
- C
- 星标
- 13k
- 派生
- 3.5k
- PR 合并指标
- 30 天内没有已合并 PR
环境准备
- 没有 Dockerfile 或 Docker Compose 文件
- 没有 Pull Request 模板
- 阅读贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
DaveGamble/cJSON 的其他 Issue
-
难度 2/5 1-3 小时 新手友好度 68/100
DaveGamble/cJSON#1106 ·
维护者通常 12 天内回复
-
Undefined-Behavior in function cJSON_SetNumberHelper可能已有人在做 关联的 PR 仍在进行中或已合并。 未关闭
难度 2/5 1-3 小时 新手友好度 70/100
DaveGamble/cJSON#1100 · 1 个 reaction ·
维护者通常 12 天内回复
-
难度 2/5 1-3 小时 新手友好度 86/100
DaveGamble/cJSON#1094 · 9 条评论 · 1 个 reaction ·
维护者通常 12 天内回复
-
难度 2/5 1-3 小时 新手友好度 68/100
DaveGamble/cJSON#1093 ·
维护者通常 12 天内回复
-
Use-after-free in cJSONUtils_ApplyPatches when a patch removes the patch array可能已有人在做 @iliasabk 于 32 天前认领。 未关闭
难度 2/5 1-3 小时 新手友好度 82/100
DaveGamble/cJSON#1082 ·
维护者通常 12 天内回复
相似的 Issue
-
bug Component component: net
难度 2/5 1-3 小时 新手友好度 78/100
RT-Thread/rt-thread#11913 · 1 条评论 ·
维护者通常 1 天内回复
-
area:docs kind:docs-drift
难度 2/5 1-3 小时 新手友好度 76/100
InauguralSystems/EigenScript#1887 ·
维护者通常 1 天内回复
-
难度 1/5 1 小时以内 新手友好度 82/100
containers/crun#2391 ·
维护者通常 1 天内回复
-
category:port-update
难度 2/5 1-3 小时 新手友好度 68/100
维护者通常 2 天内回复
-
type-bug
难度 2/5 1-3 小时 新手友好度 72/100
维护者通常 1 天内回复