【发布时间】:2016-11-16 14:06:11
【问题描述】:
我知道如何run the gcc preprocessor。 Gcc 显然对代码进行了静态分析/优化,因为如果你例如添加两个常量或移位一个常量,无论您保留“a = constant
鉴于此切片来自 SHA256 代码,
A=0x6a09e667;
B=0xbb67ae85;
C=0x3c6ef372;
D=0xa54ff53a;
E=0x510e527f;
F=0x9b05688c;
G=0x1f83d9ab;
H=0x5be0cd19;
P(A, B, C, D, E, F, G, H, W[ 0], 0x428a2f98);
运行 gcc -E 后我得到
{ tmp = ((((E) >> (6)) | ((E) << (32-(6)))) ^ (((E) >> (11))
| ((E) << (32-(11)))) ^ (((E) >> (25)) | ((E) << (32-(25)))))
+ (G ^ (E & (F ^ G))) + 0x428a2f98 + W[ 0]; D += (tmp + H);
H += tmp + ((((A) >> (2)) | ((A) << (32-(2)))) ^ (((A) >> (13))
| ((A) << (32-(13)))) ^ (((A) >> (22)) | ((A) << (32-(22)))))
+ ((A & B) | (C & (A | B))); };
对于P线,是宏的嵌套宏。
这很好,但我想要一个更简洁的结果,其中常量已被替换,常量算术已执行等。 因此,如果我得到的不是上面这样的东西:
{ tmp = hex_constant1 + W[0]; D += (tmp + 0x5be0cd19); H += tmp + hex_constant2; };
这会更符合我的喜好。我没有耐心手动计算表达式,但基本上它们应该折叠成两个十六进制常量。
是否有任何工具/命令行选项可以执行此操作?
【问题讨论】:
-
你确定你没有混合预处理器和编译器吗?预处理器只替换你的
defines(和includes和其他宏)它不执行任何类型的优化。那是编译器的工作。
标签: c gcc c-preprocessor static-analysis