Reputation: 553
When upgrading the java plugin from 3.5 to 3.6, the build gets stuck on a file and never times out. The problem also exists in 3.7.
It looks similar to another problem I recently had, but it does not seem to ever actually timeout or crash. The build just never stops. Sonarqube thrashing when doing AST scan on old Apache Axis 1.2.1 generated code
Is there an easy way to determine which rule might be causing the trouble with logging or to just add a timeout?
Update: Here is some code to reproduce the issue
public class SonarIssue {
public SonarIssue() {
super();
}
private List getOfficials(int quarterId, int categoryCode, boolean current) throws RuntimeException {
PreparedStatement preparedStatement = null;
Connection connection = null;
ResultSet resultSet = null;
boolean newTransaction = false;
ArrayList list = new ArrayList();
try {
String sql = "SELECT DISTINCT " + " o.client_ofcl_fst_nm, " + " o.client_ofcl_lst_nm, "
+ " o.client_ofcl_ttl_nm_e, " + " o.client_ofcl_ttl_nm_f, " + " o.client_ofcl_seq_no, "
+ " o.client_ofcl_sctr_nm_e, " + " o.client_ofcl_sctr_nm_f, " + " o.client2_ofcl_ctgry_cd, "
+ " o.client_ofcl_end_dt " + "FROM client_ofcl_tbl o, " + " client2_rptg_qtr_tbl q "
+ "WHERE q.client2_rptg_qtr_seq_no = ? " + " AND o.client2_ofcl_ctgry_cd = ? "
+ " AND ((o.client_ofcl_strt_dt <= " + " q.client2_rptg_qtr_end_dt) "
+ " OR o.client_ofcl_strt_dt IS NULL)" + " AND ((o.client2_ofcl_dsclsr_lst_dt >= "
+ " q.client2_rptg_qtr_strt_dt) " + " OR o.client2_ofcl_dsclsr_lst_dt IS NULL)";
if (current) {
sql = sql + " AND ((o.client_ofcl_end_dt >= " + " q.client2_rptg_qtr_strt_dt) "
+ " OR o.client_ofcl_end_dt IS NULL)";
} else {
sql = sql + " AND o.client_ofcl_end_dt < " + " q.client2_rptg_qtr_strt_dt ";
}
sql = sql + " ORDER BY nlssort(o.client_ofcl_lst_nm, " + " 'NLS_SORT = FRENCH'), "
+ " nlssort(o.client_ofcl_fst_nm, " + " 'NLS_SORT = FRENCH') ";
connection = getConnection();
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1, quarterId);
preparedStatement.setInt(2, categoryCode);
resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
SonarqubeOfficial official = new SonarqubeOfficial();
official.setFirstName(resultSet.getString(1));
official.setLastName(resultSet.getString(2));
official.setTitleEn(resultSet.getString(3));
official.setTitleFr(resultSet.getString(4));
official.setOfficialId(resultSet.getInt(5));
official.setSectorEn(resultSet.getString(6));
official.setSectorFr(resultSet.getString(7));
official.setCategoryCd(resultSet.getInt(8));
// Check if each official has an expense
if (hasExpensesForQuarter(Integer.toString(official.getOfficialId()), quarterId)) {
official.setHasExpenses(true);
} else {
official.setHasExpenses(false);
}
list.add(official);
}
} catch (SQLException sqle) {
RuntimeException exception = new RuntimeException("error.database.default", sqle);
throw exception;
} finally {
if (newTransaction) {
// TODO stop a transaction
} else {
closeResources(new Object[]{resultSet, preparedStatement});
}
}
return list;
}
public boolean hasExpensesForQuarter(String officialId, int quarterId) throws RuntimeException {
return true;
}
// below are methods that are from libraries. Since these are default return values, the code would never actually
// work.
public Connection getConnection() {
return null;
}
public static void closeResources(Object[] connResources) {
for (Object connResource : connResources) {
if (connResource != null) {
try {
if (connResource instanceof java.sql.Connection) {
((Connection) connResource).close();
} else if (connResource instanceof java.sql.ResultSet) {
((ResultSet) connResource).close();
} else if (connResource instanceof java.sql.Statement) {
((Statement) connResource).close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
public class SonarqubeOfficial implements Serializable {
private static final long serialVersionUID = 5888521931094795053L;
private int officialId;
private int categoryCd;
private String lastName;
private String firstName;
private String titleEn;
private String titleFr;
private String sectorEn;
private String sectorFr;
private boolean hasExpenses;
private boolean isReporting;
private String lastReportingDate;
private String startDate;
private String endDate;
private String lastModifiedUserName;
// getters and setters
}
(Please excuse the formatting)
A stacktrace that was printed right before it gets stuck looks like this:
Exception in thread "main" java.lang.StackOverflowError
at org.sonar.java.model.expression.BinaryExpressionTreeImpl.leftOperand(BinaryExpressionTreeImpl.java:52)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitBinaryExpression(BaseTreeVisitor.java:208)
at org.sonar.java.model.expression.BinaryExpressionTreeImpl.accept(BinaryExpressionTreeImpl.java:72)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitBinaryExpression(BaseTreeVisitor.java:208)
at org.sonar.java.model.expression.BinaryExpressionTreeImpl.accept(BinaryExpressionTreeImpl.java:72)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitBinaryExpression(BaseTreeVisitor.java:208)
at org.sonar.java.model.expression.BinaryExpressionTreeImpl.accept(BinaryExpressionTreeImpl.java:72)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitBinaryExpression(BaseTreeVisitor.java:208)
at org.sonar.java.model.expression.BinaryExpressionTreeImpl.accept(BinaryExpressionTreeImpl.java:72)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitBinaryExpression(BaseTreeVisitor.java:208)
at org.sonar.java.model.expression.BinaryExpressionTreeImpl.accept(BinaryExpressionTreeImpl.java:72)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitBinaryExpression(BaseTreeVisitor.java:208)
at org.sonar.java.model.expression.BinaryExpressionTreeImpl.accept(BinaryExpressionTreeImpl.java:72)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitBinaryExpression(BaseTreeVisitor.java:208)
at org.sonar.java.model.expression.BinaryExpressionTreeImpl.accept(BinaryExpressionTreeImpl.java:72)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitBinaryExpression(BaseTreeVisitor.java:208)
at org.sonar.java.model.expression.BinaryExpressionTreeImpl.accept(BinaryExpressionTreeImpl.java:72)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitBinaryExpression(BaseTreeVisitor.java:208)
at org.sonar.java.model.expression.BinaryExpressionTreeImpl.accept(BinaryExpressionTreeImpl.java:72)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitBinaryExpression(BaseTreeVisitor.java:208)
at org.sonar.java.model.expression.BinaryExpressionTreeImpl.accept(BinaryExpressionTreeImpl.java:72)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitBinaryExpression(BaseTreeVisitor.java:208)
at org.sonar.java.model.expression.BinaryExpressionTreeImpl.accept(BinaryExpressionTreeImpl.java:72)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitBinaryExpression(BaseTreeVisitor.java:208)
at org.sonar.java.model.expression.BinaryExpressionTreeImpl.accept(BinaryExpressionTreeImpl.java:72)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitBinaryExpression(BaseTreeVisitor.java:208)
at org.sonar.java.model.expression.BinaryExpressionTreeImpl.accept(BinaryExpressionTreeImpl.java:72)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitBinaryExpression(BaseTreeVisitor.java:208)
at org.sonar.java.model.expression.BinaryExpressionTreeImpl.accept(BinaryExpressionTreeImpl.java:72)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitBinaryExpression(BaseTreeVisitor.java:208)
at org.sonar.java.model.expression.BinaryExpressionTreeImpl.accept(BinaryExpressionTreeImpl.java:72)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitBinaryExpression(BaseTreeVisitor.java:208)
at org.sonar.java.model.expression.BinaryExpressionTreeImpl.accept(BinaryExpressionTreeImpl.java:72)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitBinaryExpression(BaseTreeVisitor.java:208)
at org.sonar.java.model.expression.BinaryExpressionTreeImpl.accept(BinaryExpressionTreeImpl.java:72)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitBinaryExpression(BaseTreeVisitor.java:208)
at org.sonar.java.model.expression.BinaryExpressionTreeImpl.accept(BinaryExpressionTreeImpl.java:72)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitVariable(BaseTreeVisitor.java:292)
at org.sonar.java.model.declaration.VariableTreeImpl.accept(VariableTreeImpl.java:179)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:37)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitBlock(BaseTreeVisitor.java:85)
at org.sonar.java.model.statement.BlockTreeImpl.accept(BlockTreeImpl.java:77)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitTryStatement(BaseTreeVisitor.java:190)
at org.sonar.java.model.statement.TryStatementTreeImpl.accept(TryStatementTreeImpl.java:172)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:37)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitBlock(BaseTreeVisitor.java:85)
at org.sonar.java.model.statement.BlockTreeImpl.accept(BlockTreeImpl.java:77)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitMethod(BaseTreeVisitor.java:80)
at org.sonar.java.model.declaration.MethodTreeImpl.accept(MethodTreeImpl.java:215)
at org.sonar.java.checks.helpers.ReassignmentFinder.getReassignments(ReassignmentFinder.java:84)
at org.sonar.java.checks.helpers.ReassignmentFinder.getClosestReassignmentOrDeclarationExpression(ReassignmentFinder.java:58)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleVariableUsedAsQuery(PreparedStatementAndResultSetCheck.java:136)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:128)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleStringConcatenation(PreparedStatementAndResultSetCheck.java:144)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:130)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleStringConcatenation(PreparedStatementAndResultSetCheck.java:144)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:130)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleStringConcatenation(PreparedStatementAndResultSetCheck.java:144)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:130)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleStringConcatenation(PreparedStatementAndResultSetCheck.java:144)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:130)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleVariableUsedAsQuery(PreparedStatementAndResultSetCheck.java:138)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:128)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleStringConcatenation(PreparedStatementAndResultSetCheck.java:144)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:130)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleStringConcatenation(PreparedStatementAndResultSetCheck.java:144)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:130)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleStringConcatenation(PreparedStatementAndResultSetCheck.java:144)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:130)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleStringConcatenation(PreparedStatementAndResultSetCheck.java:144)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:130)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleVariableUsedAsQuery(PreparedStatementAndResultSetCheck.java:138)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:128)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleStringConcatenation(PreparedStatementAndResultSetCheck.java:144)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:130)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleStringConcatenation(PreparedStatementAndResultSetCheck.java:144)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:130)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleStringConcatenation(PreparedStatementAndResultSetCheck.java:144)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:130)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleStringConcatenation(PreparedStatementAndResultSetCheck.java:144)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:130)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleVariableUsedAsQuery(PreparedStatementAndResultSetCheck.java:138)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:128)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleStringConcatenation(PreparedStatementAndResultSetCheck.java:144)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:130)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleStringConcatenation(PreparedStatementAndResultSetCheck.java:144)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:130)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleStringConcatenation(PreparedStatementAndResultSetCheck.java:144)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:130)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleStringConcatenation(PreparedStatementAndResultSetCheck.java:144)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:130)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleVariableUsedAsQuery(PreparedStatementAndResultSetCheck.java:138)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:128)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleStringConcatenation(PreparedStatementAndResultSetCheck.java:144)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:130)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleStringConcatenation(PreparedStatementAndResultSetCheck.java:144)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:130)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleStringConcatenation(PreparedStatementAndResultSetCheck.java:144)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:130)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleStringConcatenation(PreparedStatementAndResultSetCheck.java:144)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:130)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleVariableUsedAsQuery(PreparedStatementAndResultSetCheck.java:138)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:128)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleStringConcatenation(PreparedStatementAndResultSetCheck.java:144)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:130)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleStringConcatenation(PreparedStatementAndResultSetCheck.java:144)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:130)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleStringConcatenation(PreparedStatementAndResultSetCheck.java:144)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:130)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleStringConcatenation(PreparedStatementAndResultSetCheck.java:144)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:130)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleVariableUsedAsQuery(PreparedStatementAndResultSetCheck.java:138)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:128)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleStringConcatenation(PreparedStatementAndResultSetCheck.java:144)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:130)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleStringConcatenation(PreparedStatementAndResultSetCheck.java:144)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:130)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleStringConcatenation(PreparedStatementAndResultSetCheck.java:144)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:130)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleStringConcatenation(PreparedStatementAndResultSetCheck.java:144)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.getNumberQuery(PreparedStatementAndResultSetCheck.java:130)
at org.sonar.java.checks.PreparedStatementAndResultSetCheck.handleVariableUsedAsQuery(PreparedStatementAndResultSetCheck.java:138)
Upvotes: 1
Views: 1354
Reputation: 117
We had the same StackOverflowError using SonarQube 4.5.6 and Java Plugin 3.7. We disabled the rule S2695 as suggested. We are waiting for the Java plugin 3.9 ( RD 23 Dec 2015 ).
Marry Chrustmas for all of us.
Upvotes: -1
Reputation: 383
I'm using SonarQube 5.1.2 and had a pretty similar StackOverflowError in the class PreparedStatement
And ResultSetCheck
.
As a workaround I disabled the rule S2695 until they get it working again.
Upvotes: 5