我正在编写一个 LLVM 通行证,我需要找到可以定义加载指令读取的内存的每条指令。例如:
%x = alloca i32, align 4
store i32 123, i32* %x, align 4
%0 = load i32, i32* %x, align 4
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我想从加载指令到每个可能已经初始化/改变 %x 的指令。在这种情况下,只是之前的存储指令。我尝试使用 use-def 链,但这给了我定义内存的指令,也就是 alloca 指令。
bool runOnModule(Module &M) override {
for(Function &fun : M) {
for(BasicBlock &bb : fun) {
for(Instruction &instr : bb) {
if(isa<LoadInst>(instr)){
for (Use &U : instr.operands()) {
if (Instruction *Inst = dyn_cast<Instruction>(U)) {
errs() << *Inst << "\n";
}
}
}
}
}
}
return false;
}
};
Run Code Online (Sandbox Code Playgroud)
我怎样才能获得所有可能的存储指令,这些指令可以定义加载指令读取的内存?
规则CA1008指定所有枚举都应该有一个0应该命名的值Unknown(我们在这里不讨论标志)。我理解您想要防止未初始化的值自动获得含义的原因。假设我定义了以下枚举:
enum Gender
{
Male,
Female
}
class Person
{
public string Name { get; set; }
public Gender Gender { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这指定了每个人都应该是男性或女性(让我们暂时忽略性别讨论)。如果我忘记设置Gender属性,则此人自动为男性,这可能会导致问题。出于这个原因,我理解 CA1008 警告,因此 0 值应该保留给未知/未初始化的值。
因此,让我们将Gender枚举更改为不再使用 0 值:
enum Gender
{
Male = 1,
Female = 2
}
Run Code Online (Sandbox Code Playgroud)
当我不指定性别时,那么这个人就不是男性或女性。序列化过程中可能会出现问题。该值0对于调试期间的枚举不是很具有描述性。为了修复它并避免 CA1008 警告,我再次更改枚举:
enum Gender
{
Unknown = 0,
Male = 1,
Female = 2
}
Run Code Online (Sandbox Code Playgroud)
未初始化的属性现在显示为Unknown看起来不错。但是我可能引入了另一个问题,那就是该Unknown值看起来像一个有效值并且可以应用于用户。我也可能会收到有关不处理所有枚举值的警告。假设,我使用的构造函数要求我指定性别和名称以避免未初始化的属性:
public Person(string name, Gender …Run Code Online (Sandbox Code Playgroud) 我们正在将我们的构建代理从 VS2017 升级到 VS2019。我们在 CI 管道中使用 CodeAnalysis,因此我们使用以下命令安装 CodeAnalysis 工作负载:
C:\TEMP\vs_buildtools.exe --quiet --wait --norestart --nocache `
--add Microsoft.VisualStudio.Component.Static.Analysis.Tools
Run Code Online (Sandbox Code Playgroud)
这将创建一个名为的目录 C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\Microsoft\VisualStudio\v15.0\CodeAnalysis
当我用 VS2019 尝试这个时,我没有得到这样的目录。我也通过搜索检查了其他可能的位置Microsoft.CodeAnalysis.Targets。
该文档似乎说这是在Microsoft.VisualStudio.Workload.VisualStudioExtensionBuildTools,但也不管用。我也试过Microsoft.VisualStudio.ComponentGroup.ArchitectureTools.Managed,Microsoft.Component.CodeAnalysis.SDK但没有运气。有谁知道如何从命令行安装它?
code-analysis visual-studio roslyn-code-analysis visual-studio-2019
Visual Studio 2019给出了以下关于 private 的建议_myNum:改为使用auto-property。起初我很想这样做,摆脱这个private变量并拥有带有private set. 但这并没有提供相同的功能:我想要一个公共属性来公开这条给定的信息,并且只在一个可以设置这条数据的地方 - 构造函数,因此是关键字readonly。
换句话说,我是对的吗?这个建议并不总是正确的?
public class Foo
{
public int MyNum { get { return _myNum; } }
private readonly int _myNum;
public Foo(int num)
{
_myNum = num;
}
}
Run Code Online (Sandbox Code Playgroud)
应用自动完成建议,代码如下所示:
public int MyNum { get; }
public Foo(int num)
{
MyNum = num;
}
Run Code Online (Sandbox Code Playgroud) c# refactoring code-analysis visual-studio roslyn-code-analysis
我看过这篇关于使用的文章std::variant。这是因为以下代码引发了代码分析警告:
void CChristianLifeMinistryHtmlView::OnTimer(UINT_PTR nIDEvent)
{
if (nIDEvent == ID_TIMER_ZOOM)
{
//get the zoom value
VARIANT vZoom{};
vZoom.vt = VT_I4;
vZoom.lVal = 0;
ExecWB(OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, nullptr, &vZoom);
TRACE("zoom %d\n", vZoom.lVal);
//kill the timer
KillTimer(nIDEvent);
GetParent()->PostMessage(UWM_HTMLVIEW_CHANGE_ZOOM_MSG, vZoom.lVal);
return;
}
CHtmlView::OnTimer(nIDEvent);
}
Run Code Online (Sandbox Code Playgroud)
警告:
警告C26476:表达式/符号
{{0, 0, 0, 0, {0}}}使用带有多个类型指针的裸联合“union”:variant改为使用 (type.7)。
我开始尝试更改代码:
void CChristianLifeMinistryHtmlView::OnTimer(UINT_PTR nIDEvent)
{
if (nIDEvent == ID_TIMER_ZOOM)
{
//get the zoom value
std::variant<long> vZoom(0);
ExecWB(OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, nullptr, &vZoom);
TRACE("zoom %d\n", vZoom.lVal);
//kill the timer …Run Code Online (Sandbox Code Playgroud) 对于某种方法,抑制 Visual Studio(以及可能的 Roslyn 分析器)发出的所有警告的最简单方法是什么?就像我将代码从 stackoverflow 答案复制粘贴到我的类的新方法中,该代码不符合我的编码准则,但我也不想更改它,也不想插入大量pragma warning disable指令或很多SuppressMessage属性。
关于 ReSharper 警告,我可以简单地将以下属性添加到该方法中:
[SuppressMessage("ReSharper", "All")]
Run Code Online (Sandbox Code Playgroud)
但这仅适用于 ReSharper 警告,不适用于 Visual Studio 中的警告。
有谁知道在哪里可以找到运行在Windows上的实用程序/应用程序来分析C源并输出功能依赖树?
我正在寻找的东西是这样的:
PrintString-> PrintCharacter-> PrintByte-> printf的
我正在寻找一个工具来分析我的python脚本.例如
有类似的东西吗?
我正在搜索任何可以检测执行数据访问和文件操作的类的任何丢失的dispose调用的工具.如果它检查另一个性能问题,那将是很好的.
顺便说一下,我需要在代码上运行工具,而不是执行.谢谢!
我在xCode中进行了"构建和分析"并获得了"空指针的取消引用".我在下面的代码中注意到我收到消息的行.我正在为iPhone开发.
"PDFScrollView.h"
#import "ENsightAppDelegate.h"
@interface PDFScrollView : UIScrollView <UIScrollViewDelegate> {
ENsightAppDelegate *appDelegate;
}
@end
Run Code Online (Sandbox Code Playgroud)
"PDFScrollView.m"
- (id)initWithFrame:(CGRect)frame
{
if ((self = [super initWithFrame:frame])) {
// Set up the UIScrollView
self.showsVerticalScrollIndicator = NO;
self.showsHorizontalScrollIndicator = NO;
self.bouncesZoom = YES;
//self.decelerationRate = UIScrollViewDecelerationRateFast;
self.delegate = self;
[self setBackgroundColor:[UIColor grayColor]];
self.maximumZoomScale = 5;//200
self.minimumZoomScale = 0.5;//.85
self.userInteractionEnabled = YES;
self.delaysContentTouches = YES;
self.canCancelContentTouches = NO;
}
appDelegate =(ENsightAppDelegate *) [[UIApplication sharedApplication] delegate];
pdfView=[appDelegate GetLeaveView];
[self addSubview:pdfView];
return self;
}
Run Code Online (Sandbox Code Playgroud)
这不是完整的代码,粘贴我认为有用的东西.
我觉得这很奇怪.我怎么得到这个消息?

code-analysis ×10
c# ×4
.net ×1
c ×1
c++ ×1
debugging ×1
enums ×1
iphone ×1
llvm ×1
mfc ×1
objective-c ×1
performance ×1
python ×1
refactoring ×1
variant ×1
visual-c++ ×1