1 //          Copyright Brian Schott (Hackerpilot) 2014.
2 // Distributed under the Boost Software License, Version 1.0.
3 //    (See accompanying file LICENSE_1_0.txt or copy at
4 //          http://www.boost.org/LICENSE_1_0.txt)
5 
6 module analysis.asm_style;
7 
8 import std.stdio;
9 import dparse.ast;
10 import dparse.lexer;
11 import analysis.base;
12 import analysis.helpers;
13 import dsymbol.scope_ : Scope;
14 
15 /**
16  * Checks for confusing asm expressions.
17  * See_also: $(LINK https://issues.dlang.org/show_bug.cgi?id=9738)
18  */
19 class AsmStyleCheck : BaseAnalyzer
20 {
21 	alias visit = BaseAnalyzer.visit;
22 
23 	this(string fileName, const(Scope)* sc, bool skipTests = false)
24 	{
25 		super(fileName, sc, skipTests);
26 	}
27 
28 	override void visit(const AsmBrExp brExp)
29 	{
30 		if (brExp.asmBrExp !is null && brExp.asmBrExp.asmUnaExp !is null
31 				&& brExp.asmBrExp.asmUnaExp.asmPrimaryExp !is null)
32 		{
33 			addErrorMessage(brExp.line, brExp.column, "dscanner.confusing.brexp",
34 					"This is confusing because it looks like an array index. Rewrite a[1] as [a + 1] to clarify.");
35 		}
36 		brExp.accept(this);
37 	}
38 }
39 
40 unittest
41 {
42 	import analysis.config : StaticAnalysisConfig, Check;
43 
44 	StaticAnalysisConfig sac;
45 	sac.asm_style_check = Check.enabled;
46 	assertAnalyzerWarnings(q{
47 		void testAsm()
48 		{
49 			asm
50 			{
51 				mov a, someArray[1]; // [warn]: This is confusing because it looks like an array index. Rewrite a[1] as [a + 1] to clarify.
52 				add near ptr [EAX], 3;
53 			}
54 		}
55 	}}, sac);
56 
57 	stderr.writeln("Unittest for AsmStyleCheck passed.");
58 }