xmake.lua 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. add_rules("plugin.compile_commands.autoupdate", {outputdir = ".vscode"})
  2. target("RyanJson",function()
  3. set_kind("binary")
  4. -- set_toolchains("gcc") -- 确保使用 GCC
  5. set_toolchains("clang")
  6. set_plat("linux")
  7. set_arch("x86")
  8. set_languages("gnu99") -- 关键!启用 GNU 扩展
  9. add_defines("isEnableFuzzer")
  10. add_cxflags("-fsanitize=fuzzer", "-fprofile-instr-generate", "-fcoverage-mapping", {force = true} )
  11. add_ldflags("-fsanitize=fuzzer", "-fprofile-instr-generate", "-fcoverage-mapping", {force = true} )
  12. set_policy("build.ccache", false)
  13. -- set_optimize("smallest") -- -Os
  14. -- set_optimize("faster") -- -O2
  15. set_optimize("fastest") -- -O3
  16. -- set_optimize("aggressive") -- -Ofast
  17. -- 启用全部警告
  18. set_warnings("everything") -- -Wall -Wextra -Weffc++ / -Weverything
  19. -- 链接器选项:生成 map 文件
  20. -- add_ldflags("-Wl,-Map=$(buildir)/RyanJson.map")
  21. -- 开启库加固(需与 -O2 以上配合)
  22. -- add_defines("_FORTIFY_SOURCE=2") -- glibc 格式/内存函数加固
  23. -- 链接器安全硬化与优化
  24. add_ldflags(
  25. "-flto", -- 链接时优化(启用 LTO,便于 CFI 等)
  26. "-fPIE", -- 位置无关可执行
  27. "-pie", -- 与 -fPIE 搭配,启用 ASLR
  28. "-fno-omit-frame-pointer", -- 保留帧指针,便于崩溃分析
  29. "-fstack-clash-protection", -- 栈碰撞保护(平台支持时有效)
  30. "-Wl,-z,relro", -- 只读重定位(硬化)
  31. "-Wl,-z,now", -- 立即绑定(与 relro 搭配)
  32. "-Wl,-z,noexecstack", -- 栈不可执行
  33. "-Wl,-z,separate-code", -- 代码与数据段分离
  34. {force = true}
  35. )
  36. -- Sanitizer 检测项(运行时错误)
  37. add_ldflags(
  38. "-fsanitize=address", -- 内存越界、释放后使用
  39. "-fsanitize=leak", -- 内存泄漏
  40. "-fsanitize=undefined", -- 未定义行为(除零、溢出、无效移位等)
  41. "-fsanitize=pointer-compare", -- 无效指针比较
  42. "-fsanitize=pointer-subtract", -- 无效指针相减
  43. "-fsanitize=bounds", -- 数组越界
  44. "-fsanitize=float-divide-by-zero", -- 浮点除零
  45. "-fsanitize=float-cast-overflow", -- 浮点转整数溢出
  46. -- "-fsanitize=thread", -- 多线程数据竞争
  47. -- "-fsanitize=memory", -- 未初始化内存使用
  48. -- "-fsanitize=safe-stack", -- 栈分离机制
  49. -- "-fsanitize=cfi", -- 控制流完整性(需 LTO 与 Clang)
  50. -- "-fsanitize=alignment", -- 检测未对齐的内存访问
  51. -- "-fno-sanitize=alignment", -- 某些平台不兼容
  52. {force = true}
  53. )
  54. -- 编译器警告与静态分析(开发期错误检测,Clang 兼容)
  55. add_cxflags(
  56. "-g3", -- 生成调试信息"
  57. "-pedantic", -- 强制遵循 ISO C 标准
  58. "-Wall", -- 常见警告
  59. "-Wextra", -- 额外警告
  60. "-Wconversion", -- 隐式类型转换风险
  61. "-Wsign-conversion", -- 有符号/无符号转换风险
  62. "-Wdouble-promotion", -- float 自动提升为 double
  63. "-Wstrict-prototypes", -- 函数声明必须带参数类型
  64. "-Wold-style-definition", -- 检测旧式函数定义
  65. "-Wimplicit-fallthrough", -- switch/case 未显式 fallthrough
  66. "-Wshadow", -- 局部变量遮蔽
  67. "-Wcast-align", -- 类型转换对齐问题
  68. "-Wpointer-arith", -- 指针运算风险
  69. "-Warray-bounds", -- 数组越界访问
  70. "-Wshift-overflow", -- 位移造成的溢出
  71. "-Wformat-truncation", -- 格式化字符串被截断风险(替代 stringop-truncation)
  72. "-Walloc-size", -- 分配大小问题(替代 alloc-zero)
  73. "-Wnull-dereference", -- 空指针解引用
  74. "-Wtautological-compare", -- 恒真/恒假的比较
  75. "-Wstrict-overflow", -- 有符号溢出优化假设
  76. "-Wmissing-prototypes", -- 全局函数未在头文件声明
  77. "-Wmissing-declarations", -- 全局变量/函数未声明
  78. "-Wredundant-decls", -- 重复声明
  79. "-Wunreachable-code", -- 不可达代码
  80. "-Wtype-limits", -- 比较恒真/恒假的表达式(如 unsigned < 0)
  81. "-Wshift-negative-value", -- 对负数进行移位
  82. "-Wdiv-by-zero", -- 除以零(编译期可分析)
  83. "-Wformat-security", -- 格式化字符串安全问题
  84. "-Wdisabled-optimization", -- 被禁用的优化
  85. "-Wreturn-local-addr", -- 返回局部变量地址
  86. "-Wdeprecated", -- 使用已弃用的特性
  87. -- "-Wunsafe-buffer-usage", -- 不安全的数组/指针用法(Clang 新增)
  88. "-Wuninitialized", -- 使用未初始化变量
  89. "-fstack-protector-strong",-- 栈保护
  90. -- 进一步增强(可选,按需开启)
  91. "-Wmissing-include-dirs", -- 头文件目录缺失
  92. "-Wcast-qual", -- 丢弃 const/volatile 限定符的转换
  93. "-Wconditional-uninitialized", -- 条件路径未初始化
  94. "-Wcovered-switch-default", -- default 覆盖所有枚举值
  95. "-Wformat-nonliteral", -- 非字面量格式串
  96. "-Wformat-signedness", -- 格式化与符号性不匹配
  97. "-Wvla", -- 可变长度数组(不安全/不建议使用)
  98. "-fno-common", -- 禁止旧式多重定义(链接期更严格)
  99. "-fno-strict-aliasing", -- 禁止严格别名优化,减少别名相关 UB 风险
  100. "-Wno-documentation", -- 临时变比
  101. "-Wno-parentheses-equality",
  102. {force = true}
  103. )
  104. add_includedirs('./test/fuzzer', {public = true})
  105. add_files('./test/fuzzer/*.c', {public = true})
  106. --加入代码和头文件
  107. add_includedirs('./RyanJson', {public = true})
  108. add_files('./RyanJson/*.c', {public = true})
  109. add_includedirs('./example', {public = true})
  110. add_includedirs('./test', {public = true})
  111. add_includedirs('./test/valloc', {public = true})
  112. add_includedirs('./test/baseTest', {public = true})
  113. add_includedirs('./externalModule/cJSON', {public = true})
  114. add_includedirs('./externalModule/yyjson', {public = true})
  115. add_files('./example/*.c', {public = true})
  116. add_files('./test/*.c', {public = true}, {cxflags = "-w"})
  117. add_files('./test/valloc/*.c', {public = true}, {cxflags = "-w"})
  118. add_files('./test/baseTest/*.c', {public = true}, {cxflags = "-w"})
  119. add_files('./externalModule/cJSON/*.c', {public = true}, {cxflags = "-w"})
  120. add_files('./externalModule/yyjson/*.c', {public = true}, {cxflags = "-w"})
  121. end)