Bug Summary

File:plugins/Utilities/eta6g_primexd_skim/Combination.cc
Location:line 48, column 20
Description:Assigned value is garbage or undefined

Annotated Source Code

1/**************************************************************************
2* HallD software *
3* Copyright(C) 2020 GlueX and PrimEX-D Collaborations *
4* *
5* Author: The GlueX and PrimEX-D Collaborations *
6* Contributors: Igal Jaegle *
7* *
8* *
9* This software is provided "as is" without any warranty. *
10**************************************************************************/
11
12#include "Combination.h"
13
14using namespace std;
15
16Combination::Combination (int npar) {
17 n = npar;
18 maxCombi = 0;
19 if (n < 2) return;
20 if (n >= MAXCOMBI32) return;
21 combi = new unsigned char [n];
22 iCombi = 0;
23 maxCombi = calcMaxCombi ();
24 list = new unsigned char [maxCombi * n];
25 if (n & 1) oddCombi ();
26 else allCombi (0, 0);
27}
28
29void Combination::getCombi (int i) {
30 memcpy (combi, list + (i * n), n);
31}
32
33void Combination::oddCombi () {
34 for (int i = 0; i < n; i++) {
35 combi [n-1] = i;
36 allCombi (1 << i, 0);
37 }
38}
39
40void Combination::allCombi (int used, int deep) {
41 int nrem = n - 2 * deep - (n & 1);
42 int remain [nrem];
43 int irem = 0;
44 for (int i = 0; i < n; i++)
1
Loop condition is false. Execution continues on line 48
45 if ( ! ( (1 << i) & used ) )
46 remain [irem++] = i;
47
48 combi [deep*2] = remain [0];
2
Assigned value is garbage or undefined
49 for (int j = 1; j < nrem; j++) {
50 combi [deep*2+1] = remain [j];
51 int xused = (1 << remain [0]) | (1 << remain [j]) | used ;
52 if (nrem >= 4)
53 allCombi (xused, deep + 1);
54 else {
55 memcpy (list + (iCombi++) * n , combi, n);
56 }
57 }
58}
59
60int Combination::calcMaxCombi () {
61 int max = 1;
62 int nn = n;
63 if (! (nn & 1)) nn--;
64 while (nn > 0) {
65 max *= nn;
66 nn -= 2;
67 }
68 return (max);
69}
70