Remove GCC-dehydra support

This commit is contained in:
trav90
2016-04-28 10:16:42 -05:00
committed by roytam1
parent c987116e01
commit aad61641fe
16 changed files with 0 additions and 536 deletions
-37
View File
@@ -5,43 +5,6 @@
# The entire tree should be subject to static analysis using the XPCOM
# script. Additional scripts may be added by specific subdirectories.
DEHYDRA_SCRIPT = $(topsrcdir)/config/static-checking.js
ifndef JS_STANDALONE
DEHYDRA_MODULES = \
$(topsrcdir)/xpcom/analysis/final.js \
$(topsrcdir)/xpcom/analysis/must-override.js \
$(NULL)
TREEHYDRA_MODULES = \
$(topsrcdir)/xpcom/analysis/outparams.js \
$(topsrcdir)/xpcom/analysis/stack.js \
$(topsrcdir)/xpcom/analysis/flow.js \
$(topsrcdir)/xpcom/analysis/static-init.js \
$(topsrcdir)/layout/generic/frame-verify.js \
$(NULL)
endif
TREEHYDRA_MODULES += \
$(topsrcdir)/js/src/jsstack.js \
$(NULL)
DEHYDRA_ARG_PREFIX=-fplugin-arg-gcc_treehydra-
DEHYDRA_ARGS = \
$(DEHYDRA_ARG_PREFIX)script=$(DEHYDRA_SCRIPT) \
$(DEHYDRA_ARG_PREFIX)topsrcdir=$(topsrcdir) \
$(DEHYDRA_ARG_PREFIX)objdir=$(DEPTH) \
$(DEHYDRA_ARG_PREFIX)dehydra-modules=$(subst $(NULL) ,$(COMMA),$(strip $(DEHYDRA_MODULES))) \
$(DEHYDRA_ARG_PREFIX)treehydra-modules=$(subst $(NULL) ,$(COMMA),$(strip $(TREEHYDRA_MODULES))) \
$(NULL)
DEHYDRA_FLAGS = -fplugin=$(DEHYDRA_PATH) $(DEHYDRA_ARGS)
ifdef DEHYDRA_PATH
OS_CXXFLAGS += $(DEHYDRA_FLAGS)
endif
ifdef ENABLE_CLANG_PLUGIN
CLANG_PLUGIN := $(DEPTH)/build/clang-plugin/$(DLL_PREFIX)clang-plugin$(DLL_SUFFIX)
OS_CXXFLAGS += -Xclang -load -Xclang $(CLANG_PLUGIN) -Xclang -add-plugin -Xclang moz-check
-147
View File
@@ -1,147 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/**
* A script for GCC-dehydra to analyze the Mozilla codebase and catch
* patterns that are incorrect, but which cannot be detected by a compiler. */
/**
* Activate Treehydra outparams analysis if running in Treehydra.
*/
function treehydra_enabled() {
return this.hasOwnProperty('TREE_CODE');
}
sys.include_path.push(options.topsrcdir);
include('string-format.js');
let modules = [];
function LoadModules(modulelist)
{
if (modulelist == "")
return;
let modulenames = modulelist.split(',');
for each (let modulename in modulenames) {
let module = { __proto__: this };
include(modulename, module);
modules.push(module);
}
}
LoadModules(options['dehydra-modules']);
if (treehydra_enabled())
LoadModules(options['treehydra-modules']);
function process_type(c)
{
for each (let module in modules)
if (module.hasOwnProperty('process_type'))
module.process_type(c);
}
function hasAttribute(c, attrname)
{
var attr;
if (c.attributes === undefined)
return false;
for each (attr in c.attributes)
if (attr.name == 'user' && attr.value[0] == attrname)
return true;
return false;
}
// This is useful for detecting method overrides
function signaturesMatch(m1, m2)
{
if (m1.shortName != m2.shortName)
return false;
if ((!!m1.isVirtual) != (!!m2.isVirtual))
return false;
if (m1.isStatic != m2.isStatic)
return false;
let p1 = m1.type.parameters;
let p2 = m2.type.parameters;
if (p1.length != p2.length)
return false;
for (let i = 0; i < p1.length; ++i)
if (!params_match(p1[i], p2[i]))
return false;
return true;
}
function params_match(p1, p2)
{
[p1, p2] = unwrap_types(p1, p2);
for (let i in p1)
if (i == "type" && !types_match(p1.type, p2.type))
return false;
else if (i != "type" && p1[i] !== p2[i])
return false;
for (let i in p2)
if (!(i in p1))
return false;
return true;
}
function types_match(t1, t2)
{
if (!t1 || !t2)
return false;
[t1, t2] = unwrap_types(t1, t2);
return t1 === t2;
}
function unwrap_types(t1, t2)
{
while (t1.variantOf)
t1 = t1.variantOf;
while (t2.variantOf)
t2 = t2.variantOf;
return [t1, t2];
}
const forward_functions = [
'process_type',
'process_tree_type',
'process_decl',
'process_tree_decl',
'process_function',
'process_tree',
'process_cp_pre_genericize',
'input_end'
];
function setup_forwarding(n)
{
this[n] = function() {
for each (let module in modules) {
if (module.hasOwnProperty(n)) {
module[n].apply(this, arguments);
}
}
}
}
for each (let n in forward_functions)
setup_forwarding(n);
-18
View File
@@ -7265,24 +7265,6 @@ fi
AC_SUBST_LIST(MOZ_GLUE_WRAP_LDFLAGS)
export MOZ_GLUE_WRAP_LDFLAGS
dnl ========================================================
dnl = Enable static checking using gcc-dehydra
dnl ========================================================
MOZ_ARG_WITH_STRING(static-checking,
[ --with-static-checking=path/to/gcc_dehydra.so
Enable static checking of code using GCC-dehydra],
DEHYDRA_PATH=$withval,
DEHYDRA_PATH= )
if test -n "$DEHYDRA_PATH"; then
if test ! -f "$DEHYDRA_PATH"; then
AC_MSG_ERROR([The dehydra plugin is not at the specified path.])
fi
AC_DEFINE(NS_STATIC_CHECKING)
fi
AC_SUBST(DEHYDRA_PATH)
dnl ========================================================
dnl = Enable using the clang plugin to build
dnl ========================================================
-18
View File
@@ -3302,24 +3302,6 @@ if test -n "$JS_OOM_BREAKPOINT"; then
AC_DEFINE(JS_OOM_BREAKPOINT)
fi
dnl ========================================================
dnl = Enable static checking using gcc-dehydra
dnl ========================================================
MOZ_ARG_WITH_STRING(static-checking,
[ --with-static-checking=path/to/gcc_dehydra.so
Enable static checking of code using GCC-dehydra],
DEHYDRA_PATH=$withval,
DEHYDRA_PATH= )
if test -n "$DEHYDRA_PATH"; then
if test ! -f "$DEHYDRA_PATH"; then
AC_MSG_ERROR([The dehydra plugin is not at the specified path.])
fi
AC_DEFINE(NS_STATIC_CHECKING)
fi
AC_SUBST(DEHYDRA_PATH)
dnl ========================================================
dnl = Enable using the clang plugin to build
dnl ========================================================
-3
View File
@@ -4,9 +4,6 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
if CONFIG['DEHYDRA_PATH']:
DIRS += ['analysis-tests']
if CONFIG['JS_BUNDLED_EDITLINE']:
DIRS += ['editline']
-95
View File
@@ -1,95 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/**
* graph-frameclasses.js: a dehydra script to collect information about
* the class hierarchy of frame types.
*/
function inheritsFrom(t, baseName)
{
let name = t.name;
if (name == baseName)
return true;
for each (let base in t.bases)
if (inheritsFrom(base.type, baseName))
return true;
return false;
}
let output = [];
function process_type(t)
{
if ((t.kind == "class" || t.kind == "struct")) {
if (!t.isIncomplete && inheritsFrom(t, 'nsIFrame')) {
if (inheritsFrom(t, 'nsISupports'))
warning("nsIFrame derivative %s inherits from nsISupports but is not refcounted.".format(t.name), t.loc);
let nonFrameBases = [];
output.push('CLASS-DEF: %s'.format(t.name));
for each (let base in t.bases) {
if (inheritsFrom(base.type, 'nsIFrame')) {
output.push('%s -> %s;'.format(base.type.name, t.name));
}
else if (base.type.name != 'nsQueryFrame') {
nonFrameBases.push(base.type.name);
}
}
output.push('%s [label="%s%s"];'.format(t.name, t.name,
["\\n(%s)".format(b) for each (b in nonFrameBases)].join('')));
}
}
}
let frameIIDRE = /::kFrameIID$/;
let queryFrameRE = /^do_QueryFrame::operator/;
/* A list of class names T that have do_QueryFrame<T> used */
let needIDs = [];
/* A map of class names that have a kFrameIID declared */
let haveIDs = {};
// We match up needIDs with haveIDs at the end because static variables are
// not present in the .members array of a type
function process_tree_decl(d)
{
d = dehydra_convert(d);
if (d.name && frameIIDRE.exec(d.name)) {
haveIDs[d.memberOf.name] = 1;
}
}
function process_cp_pre_genericize(d)
{
d = dehydra_convert(d);
if (queryFrameRE.exec(d.name) && d.template === undefined) {
let templtype = d.type.type.type;
while (templtype.typedef !== undefined)
templtype = templtype.typedef;
needIDs.push([templtype.name, d.loc]);
}
}
function input_end()
{
for each (let [name, loc] in needIDs) {
if (!haveIDs.hasOwnProperty(name)) {
error("nsQueryFrame<%s> found, but %s::kFrameIID is not declared".format(name, name), loc);
}
}
if (output.length > 0) {
write_file(sys.aux_base_name + '.framedata', output.join('\n'));
}
}
-3
View File
@@ -15,9 +15,6 @@ TEST_DIRS += [
if CONFIG['OS_ARCH'] == 'WINNT':
TEST_DIRS += ['windows']
if CONFIG['DEHYDRA_PATH']:
TEST_DIRS += ['static-checker']
FAIL_ON_WARNINGS = True
EXPORTS.testing += [
-146
View File
@@ -1,146 +0,0 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
OUTPARAMS_WARNING_TESTCASES = \
e1.cpp \
e4.cpp \
e6.cpp \
e7.cpp \
e8.cpp \
e9.cpp \
e10.cpp \
e11.cpp \
e12.cpp \
e13.cpp \
$(NULL)
OUTPARAMS_NS_FAILED_TESTCASES = \
e2.cpp \
e5.cpp \
$(NULL)
OUTPARAMS_PASS_TESTCASES = \
o1.cpp \
o2.cpp \
o3.cpp \
o4.cpp \
o5.cpp \
o6.cpp \
o7.cpp \
o8.cpp \
o9.cpp \
o10.cpp \
o11.cpp \
o12.cpp \
o13.cpp \
o14.cpp \
o15.cpp \
o16.cpp \
onull.cpp \
onull2.cpp \
opmember.cpp \
$(NULL)
FLOW_PASS_TESTCASES = \
flow_through_pass.cpp
FLOW_FAILURE_TESTCASES = \
flow_through_fail.cpp
MUST_OVERRIDE_PASS_TESTCASES = \
OverrideOK1.cpp \
OverrideOK2.cpp \
OverrideOK3-NamespaceTypedef.cpp \
$(NULL)
MUST_OVERRIDE_FAILURE_TESTCASES = \
OverrideFail1.cpp \
OverrideFail2.cpp \
OverrideFail3.cpp \
OverrideFail4.cpp \
$(NULL)
OVERRIDE_PASS_TESTCASES = \
override-pass.cpp \
override-namespace-typedef.cpp \
$(NULL)
OVERRIDE_FAILURE_TESTCASES = \
override-global.cpp \
override-signature.cpp \
override-static.cpp \
override-virtual.cpp \
$(NULL)
STATIC_INIT_PASS_TESTCASES = \
TestStaticInitStructOK.cpp \
$(NULL)
STATIC_INIT_WARNING_TESTCASES = \
TestStaticInitAttr.cpp \
TestStaticInitConstructor.cpp \
TestStaticInitGlobal.cpp \
TestStaticInitGlobalConst.cpp \
$(NULL)
STATIC_FAILURE_TESTCASES = \
$(FLOW_FAILURE_TESTCASES) \
$(MUST_OVERRIDE_FAILURE_TESTCASES) \
$(OVERRIDE_FAILURE_TESTCASES) \
$(NULL)
STATIC_WARNING_TESTCASES = \
$(OUTPARAMS_WARNING_TESTCASES) \
$(STATIC_INIT_WARNING_TESTCASES) \
$(NULL)
STATIC_PASS_TESTCASES = \
$(OUTPARAMS_NS_FAILED_TESTCASES) \
$(OUTPARAMS_PASS_TESTCASES) \
$(FLOW_PASS_TESTCASES) \
$(MUST_OVERRIDE_PASS_TESTCASES) \
$(OVERRIDE_PASS_TESTCASES) \
$(STATIC_INIT_PASS_TESTCASES) \
$(NULL)
include $(topsrcdir)/config/rules.mk
# We want to compile each file and invert the result to ensure that
# compilation failed.
check:: \
$(STATIC_FAILURE_TESTCASES:.cpp=.s-fail) \
$(STATIC_WARNING_TESTCASES:.cpp=.s-warn) \
$(STATIC_PASS_TESTCASES:.cpp=.s-pass)
%.s-fail: %.cpp $(GLOBAL_DEPS) $(DEHYDRA_SCRIPTS) $(call mkdir_deps,$(MDDEPDIR))
@printf 'Compiling $(<F) to check that the static-analysis script is checking properly...'
@if $(CCC) $(OUTOPTION)/dev/null -S $(COMPILE_CXXFLAGS) $(_VPATH_SRCS) >$(*F).errlog 2>&1; then \
printf 'fail:\nerror: compilation of $(<F) succeeded. It shouldn't have!\n'; \
exit 1; \
else \
printf 'ok.\n'; \
fi
%.s-warn: %.cpp $(GLOBAL_DEPS) $(DEHYDRA_SCRIPTS) $(call mkdir_deps,$(MDDEPDIR))
@printf 'Compiling $(<F) to check that the static-analysis script is checking properly...'
@if $(CCC) -Werror $(OUTOPTION)/dev/null -S $(COMPILE_CXXFLAGS) $(_VPATH_SRCS) >$(*F).errlog 2>&1; then \
printf 'fail:\nerror: compilation of $(<F) succeeded with -Werror. It shouldn't have!\n'; \
exit 1; \
fi
@if $(CCC) $(OUTOPTION)/dev/null -S $(COMPILE_CXXFLAGS) $(_VPATH_SRCS) >$(*F).werrlog 2>&1; then \
printf 'ok.\n'; \
else \
printf 'fail:\nerror: compilation of $(<F) without -Werror failed. A warning should have been issued.\n'; \
exit 1; \
fi
%.s-pass: %.cpp $(GLOBAL_DEPS) $(DEHYDRA_SCRIPTS) $(call mkdir_deps,$(MDDEPDIR))
@printf 'Compiling $(<F) to check that the static-analysis script is checking properly...'
@if $(CCC) -Werror $(OUTOPTION)/dev/null -S $(COMPILE_CXXFLAGS) $(_VPATH_SRCS) >$(*F).errlog 2>&1; then \
printf 'ok.\n'; \
else \
printf 'fail:\nerror: compilation of $(<F) failed. It shouldn't have!\n'; \
exit 1; \
fi
@@ -1,5 +0,0 @@
int foo() __attribute__((constructor));
int foo() {
return 0;
}
@@ -1,7 +0,0 @@
struct Blah {
public:
Blah() { }
~Blah() { } // raises call to __cxa_atexit
};
Blah b;
@@ -1,5 +0,0 @@
int foo() {
return 0;
}
int x = foo();
@@ -1,5 +0,0 @@
int foo() {
return 0;
}
const static int x = foo();
@@ -1,5 +0,0 @@
struct Blah {
int i;
};
Blah b = { 3 };
@@ -1,16 +0,0 @@
static void MUST_FLOW_THROUGH(const char *label) {
}
int test(int x, int y) {
MUST_FLOW_THROUGH("out");
if (!x) {
x = y;
goto out;
}
return y;
out:
x--;
return x;
}
@@ -1,20 +0,0 @@
static void MUST_FLOW_THROUGH(const char *label) {
}
int test(int x, int y) {
if (x == 3)
return 0;
if(x)
MUST_FLOW_THROUGH("out");
if (x) {
x = y;
goto out;
}
return y;
out:
x--;
return x;
}
-6
View File
@@ -1,6 +0,0 @@
# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
# vim: set filetype=python:
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.