int printf(char *, ...);
int main()
{
printf("%d\n", (int)sizeof("a"));
}//串字面大小.
接着
// test1.c
int printf(char *, ...);
int main()
{
int a = 0;
// dmd为1,其他编译器为-1
// 删掉括号,漏洞消失
int b = - (a) - 1;
printf("%d\n", b);
}
// test2.c
int example2()
{
int *a, *b;
// 错误`(a) - (cast(char*)b)`: `int*` 和 `char*`不匹配.删除(a)括号,又正确了.
long diff = (char*)(a) - (char*)b;
}
再一个:
void fn()
{
int *p;
// 错误,p非整,是`整*`.
// 去掉(p)括号,又可以了.
unsigned x = (unsigned)(p) & 1;
}
typedef union value_u {
void *p;
} value_t;
typedef struct data_s {
void *p;
} data_t;
void fn()
{
value_t a;
const value_t b;
// 错误,不能隐式转换`常`至`非常`.
a = b;
data_t aa;
const data_t bb;
// 同样错误.
aa = bb;
}
如果,void *p
为非指针类型,则错误消失了.
如果,常
用普通名,而不是typedef
,错误就不见了.
翻译时
static void terminate() {}
//转成
extern(C) private void terminate() {}
时,有冲突,标记为extern(D)
时,改了abi
.
d
为ImportC
加了静态符号
.或许可用@Cstatic
或pragma(noLinkerSymbol)
来暴露给d代码.
即使,带私
,编译器仍发出全局终止
符号至目标
文件.
原因是,元编程时,包括私有
,生成大量符号,跨多文件时,经常相同.D
再放在COMDAT
节中.链接器
只在exe
中有一个.
不合并,导致重复及增加大小.这是重大
变化.
只需要针对-betterC
代码.C
翻译成D
.不知如何处理static
.翻译成私
,仍导致符号冲突.只需要类似ldc
的pragma(LDC_no_moduleinfo)
和pragma(LDC_no_typeinfo)
就行.
// dimodule.di
void fn()() { return; }
// main.d
import dimodule;
void main() { fn(); }
dmd main.d
没问题,dmd -i main.d
对模板参数
报错.
int main() { double x = __builtin_inf(); }
//同样