[c#]如何指定/ GS,c#应用程序的选项?

时间:2009-11-18 04:11:20

标签: c# compiler-options

如您所知,/GS是Visual C ++编译器或链接器选项。

  1. 我可以在c#编译器或链接器中指定/ GS吗?

  2. c#应用程序默认启用这些标志吗?

    [编辑]:更改问题内容:

    2a上。是否启用了这些功能(通过Visual C ++中的这些编译器选项)    默认情况下在c#应用程序中?

  3. 有没有办法找出使用这些标志构建.exe / .dll文件?

  4. 提前致谢。

2 个答案:

答案 0 :(得分:5)

C#中不存在这些选项,因为C#生成托管代码,C ++生成本机代码(机器语言代码)。托管代码被称为“可验证”,因为它比C / C ++具有更严格的检查,并以C ++和本机代码无法实现的方式强制执行类型安全。 (这些检查与使用C ++ / CLI编写的托管代码无关)。

这很大程度上是因为本机代码直接在硬件上运行,托管代码在.NET运行时(CLR)内运行。

请允许我逐一查看选项

  1. / analyze - 我并不熟悉这个选项,但是查看list of what it checks,这些错误都不可能或托管代码中存在问题。例如,第一个警告C6031不是问题,因为托管代码会抛出一个在不成功时无法忽略的异常。
  2. / GS - 托管代码(忽略unsafe)不直接访问内存,不受缓冲区溢出的影响。你会得到一个例外,而不是溢出到其他记忆中。
  3. / DynamicBase - 托管代码生成称为中间语言(IL)的字节,并在运行时动态编译为本机代码(JIT),因此没有固定的地址空间来随机化。
  4. / SafeSEH - 托管代码有自己的异常机制,不使用SEH。

答案 1 :(得分:2)

我猜你试图进行代码审核/运行静态分析工具以确保遵循security/SDL best practices。如果你继续阅读......

有一个名为Binscope的工具可用于检查您的native / C ++二进制文件是使用/ GS,/ SafeSEH,/ NXCOMPAT和/ DYNAMICBASE编译的。这些是特定于C ++的选项,使攻击者更难以利用缓冲区溢出。 (Binscope还会检查其他一些事情)

Binscope在C#/托管二进制文件中唯一检查的是它们是否使用强名称。与C#的binscope最接近的是FxCop,它将详细说明托管.Net代码中的一系列潜在问题。为了安全起见,请修复FxCop产生的任何安全警告,并且即将开始。

/ analyze标志使Visual Studio对您的本机代码进行一些静态分析,并让您知道它是否发现任何可疑内容。 C#/ .Net等价物是FxCop的安全部分。