这是否属于Apple Clang 14编译器的优化Bug?
Apple Clang 14.0.0 -O3优化下Base64解码表初始化异常是否为编译器Bug?
问题背景
一段用于初始化Base64解码表的代码,在Apple Clang 11.0.3版本中即使开启-O3优化也能输出预期结果,但在Apple Clang 14.0.0版本开启-O3优化时,出现不符合逻辑的输出。ASCII码65对应字符'A',在Base64编码表中是第0位,预期decodeBase64Table[65]的值为0,但Clang 14.0.0优化后输出为64(即invalid变量的初始值)。
源代码
#include <cstdio> static const char encodeBase64Table[64 + 1] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; int main() { // create decoding table unsigned long invalid = 64; unsigned long decodeBase64Table[256] = {}; for (unsigned long i = 0; i < 256; i++) decodeBase64Table[i] = invalid; for (unsigned long i = 0; i < 64; i++) { decodeBase64Table[(unsigned char)encodeBase64Table[i]] = i; } printf("decodeBase64Table[65] = %lu\n", decodeBase64Table[65]); return 0; }
测试结果
Apple Clang 11.0.3(预期输出,开启-O3优化)
/t/s/1673994196 ❯❯❯ /usr/bin/clang++ --version Apple clang version 11.0.3 (clang-1103.0.32.62) Target: x86_64-apple-darwin21.6.0 Thread model: posix InstalledDir: /Library/Developer/CommandLineTools/usr/bin /t/s/1673994196 ❯❯❯ /usr/bin/clang++ -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk -O3 -std=c++17 a.cpp /t/s/1673994196 ❯❯❯ ./a.out decodeBase64Table[65] = 0
Apple Clang 14.0.0(非预期输出,仅开启-O3优化时出现)
/t/s/1673994196 ❯❯❯ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ --version Apple clang version 14.0.0 (clang-1400.0.29.202) Target: x86_64-apple-darwin21.6.0 Thread model: posix InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin /t/s/1673994196 ❯❯❯ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk -O3 -std=c++17 a.cpp /t/s/1673994196 ❯❯❯ ./a.out decodeBase64Table[65] = 64
分析与结论
这段代码逻辑清晰:先将解码表所有元素初始化为invalid(64),再遍历Base64编码表的前64个字符,将对应ASCII值的解码表项设置为其索引值。其中'A'(ASCII 65)是编码表的第一个字符,对应索引0,因此decodeBase64Table[65]应被设置为0。
仅在Apple Clang 14.0.0开启-O3优化时出现异常输出,低版本编译器及无优化时行为正常,说明这大概率是该版本编译器在高优化级别下的优化Bug。可以尝试通过Apple开发者反馈渠道或LLVM Bug Tracker提交该问题。
内容的提问来源于stack exchange,提问作者Nehal J Wani
相关产品推荐
相关产品推荐

