Opened 11 years ago
Closed 10 years ago
#210 closed defect (fixed)
Build warnings from RTC
| Reported by: | MatthewWhiting | Owned by: | MatthewWhiting |
|---|---|---|---|
| Priority: | normal | Milestone: | Release-1.6 |
| Component: | Building/Installation | Version: | 1.5 |
| Severity: | normal | Keywords: | |
| Cc: |
Description
Email from Ben:
Reported on the RTC:
src/ATrous/filter.cc: In member function 'void duchamp::Filter::loadSpline()':
src/ATrous/filter.cc:173:72: warning: iteration 8u invokes undefined behavior [-Waggressive-loop-optimizations]
for(int i=0;i<12;i++)(*this->sigmaFactors[2])[i] = sigmaFactors3D[i];
^
src/ATrous/filter.cc:173:5: note: containing loop
for(int i=0;i<12;i++)(*this->sigmaFactors[2])[i] = sigmaFactors3D[i];
^
src/ATrous/filter.cc: In member function 'void duchamp::Filter::loadHaar()':
src/ATrous/filter.cc:238:72: warning: iteration 9u invokes undefined behavior [-Waggressive-loop-optimizations]
for(int i=0;i<12;i++)(*this->sigmaFactors[2])[i] = sigmaFactors3D[i];
^
src/ATrous/filter.cc:238:5: note: containing loop
for(int i=0;i<12;i++)(*this->sigmaFactors[2])[i] = sigmaFactors3D[i];
^
src/ATrous/filter.cc:231:72: warning: iteration 7u invokes undefined behavior [-Waggressive-loop-optimizations]
for(int i=0;i<12;i++)(*this->sigmaFactors[1])[i] = sigmaFactors2D[i];
^
src/ATrous/filter.cc:231:5: note: containing loop
for(int i=0;i<12;i++)(*this->sigmaFactors[1])[i] = sigmaFactors2D[i];
^
src/ATrous/filter.cc:225:72: warning: iteration 7u invokes undefined behavior [-Waggressive-loop-optimizations]
for(int i=0;i<19;i++)(*this->sigmaFactors[0])[i] = sigmaFactors1D[i];
^
src/ATrous/filter.cc:225:5: note: containing loop
for(int i=0;i<19;i++)(*this->sigmaFactors[0])[i] = sigmaFactors1D[i];
^
src/ATrous/filter.cc: In member function 'void duchamp::Filter::loadTriangle()':
src/ATrous/filter.cc:208:72: warning: iteration 9u invokes undefined behavior [-Waggressive-loop-optimizations]
for(int i=0;i<12;i++)(*this->sigmaFactors[2])[i] = sigmaFactors3D[i];
^
src/ATrous/filter.cc:208:5: note: containing loop
for(int i=0;i<12;i++)(*this->sigmaFactors[2])[i] = sigmaFactors3D[i];
As an example:
double sigmaFactors3D[8] = {1.00000000000,9.56543592e-1,1.20336499e-1,3.49500154e-2,
1.18164242e-2,4.13233507e-3,1.45703714e-3,5.14791120e-4};
this->sigmaFactors[2]->resize(8);
for(int i=0;i<12;i++)(*this->sigmaFactors[2])[i] = sigmaFactors3D[i];
Note that at index location > 7 sigmaFactors3D[i] will be undefined, and possibly even an invalid memory location.
Should really avoid these magic numbers repeated, use a single const or var to avoid duplication.
Change History (3)
comment:1 Changed 11 years ago by
| Status: | new → assigned |
|---|
comment:2 Changed 11 years ago by
comment:3 Changed 10 years ago by
| Resolution: | → fixed |
|---|---|
| Status: | assigned → closed |
Note that we have changed the way the reconFilter is instantiated in Param. Rather than doing
this->reconFilter.define(this->filterCode);
we now do
FilterFactory filtFac; this->reconFilter = filtFac.getFilter(this->filterCode);
Closing ticket, as things are building OK now.
Note: See
TracTickets for help on using
tickets.

Better (more O-O) way of doing this would be to have an abstract Filter base class and then derive specific classes for each of the three filters.
This has been added in [1339], along with a FilterFactory? class to do the selection. Need a little bit more thought as to whether the way I've got the filter coefficients referenced is correct, but will probably do for now.
Also, Param::reconFilter is now a pointer, but the interface to it remains via a reference.