mirror of
https://github.com/cuberite/TCLAP.git
synced 2025-08-04 02:06:29 -04:00
Check for NULL constraint and raise exception if found.
User is not allowed to provide a NULL constraint to the various ARG constructors. This patch makes sure the Constraint is not NULL before dereferencing and raises a logic_error if it is NULL. Also included the two new tests test88 and test89 in runtests script.
This commit is contained in:
parent
e2ed6cfbc4
commit
4970b7e793
@ -2,7 +2,7 @@
|
|||||||
noinst_PROGRAMS = test1 test2 test3 test4 test5 test6 test7 test8 test9 \
|
noinst_PROGRAMS = test1 test2 test3 test4 test5 test6 test7 test8 test9 \
|
||||||
test10 test11 test12 test13 test14 test15 test16 \
|
test10 test11 test12 test13 test14 test15 test16 \
|
||||||
test17 test18 test19 test20 test21 test22 test23 test24 \
|
test17 test18 test19 test20 test21 test22 test23 test24 \
|
||||||
test25 test26 test27
|
test25 test26 test27 test28
|
||||||
|
|
||||||
test1_SOURCES = test1.cpp
|
test1_SOURCES = test1.cpp
|
||||||
test2_SOURCES = test2.cpp
|
test2_SOURCES = test2.cpp
|
||||||
@ -31,6 +31,7 @@ test24_SOURCES = test24.cpp
|
|||||||
test25_SOURCES = test25.cpp
|
test25_SOURCES = test25.cpp
|
||||||
test26_SOURCES = test26.cpp
|
test26_SOURCES = test26.cpp
|
||||||
test27_SOURCES = test27.cpp
|
test27_SOURCES = test27.cpp
|
||||||
|
test28_SOURCES = test28.cpp
|
||||||
|
|
||||||
AM_CPPFLAGS = -I$(top_srcdir)/include
|
AM_CPPFLAGS = -I$(top_srcdir)/include
|
||||||
|
|
||||||
|
35
examples/test28.cpp
Normal file
35
examples/test28.cpp
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "tclap/CmdLine.h"
|
||||||
|
|
||||||
|
using namespace TCLAP;
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
CmdLine cmd("test constraint bug");
|
||||||
|
ValueArg<int> arg("i","int", "tests int arg", false, 4711, NULL, cmd);
|
||||||
|
cout << "Expected exception" << endl;
|
||||||
|
} catch(std::logic_error &e) { /* expected */ }
|
||||||
|
|
||||||
|
try {
|
||||||
|
CmdLine cmd("test constraint bug");
|
||||||
|
ValueArg<int> arg1("i","int", "tests int arg", false, 4711, NULL, NULL);
|
||||||
|
cout << "Expected exception" << endl;
|
||||||
|
} catch(std::logic_error &e) { /* expected */ }
|
||||||
|
|
||||||
|
try {
|
||||||
|
CmdLine cmd("test constraint bug");
|
||||||
|
MultiArg<int> arg1("i","int", "tests int arg", false, NULL, NULL);
|
||||||
|
cout << "Expected exception" << endl;
|
||||||
|
} catch(std::logic_error &e) { /* expected */ }
|
||||||
|
|
||||||
|
try {
|
||||||
|
CmdLine cmd("test constraint bug");
|
||||||
|
MultiArg<int> arg1("i","int", "tests int arg", false, NULL, cmd);
|
||||||
|
cout << "Expected exception" << endl;
|
||||||
|
} catch(std::logic_error &e) { /* expected */ }
|
||||||
|
|
||||||
|
cout << "Passed" << endl;
|
||||||
|
}
|
@ -28,6 +28,7 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
namespace TCLAP {
|
namespace TCLAP {
|
||||||
|
|
||||||
@ -62,6 +63,12 @@ class Constraint
|
|||||||
* functions but without a virtual destructor.
|
* functions but without a virtual destructor.
|
||||||
*/
|
*/
|
||||||
virtual ~Constraint() { ; }
|
virtual ~Constraint() { ; }
|
||||||
|
|
||||||
|
static std::string shortID(Constraint<T> *constraint) {
|
||||||
|
if (!constraint)
|
||||||
|
throw std::logic_error("Cannot create a ValueArg with a NULL constraint");
|
||||||
|
return constraint->shortID();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
} //namespace TCLAP
|
} //namespace TCLAP
|
||||||
|
@ -276,7 +276,7 @@ MultiArg<T>::MultiArg(const std::string& flag,
|
|||||||
Visitor* v)
|
Visitor* v)
|
||||||
: Arg( flag, name, desc, req, true, v ),
|
: Arg( flag, name, desc, req, true, v ),
|
||||||
_values(std::vector<T>()),
|
_values(std::vector<T>()),
|
||||||
_typeDesc( constraint->shortID() ),
|
_typeDesc( Constraint<T>::shortID(constraint) ),
|
||||||
_constraint( constraint ),
|
_constraint( constraint ),
|
||||||
_allowMore(false)
|
_allowMore(false)
|
||||||
{
|
{
|
||||||
@ -293,7 +293,7 @@ MultiArg<T>::MultiArg(const std::string& flag,
|
|||||||
Visitor* v)
|
Visitor* v)
|
||||||
: Arg( flag, name, desc, req, true, v ),
|
: Arg( flag, name, desc, req, true, v ),
|
||||||
_values(std::vector<T>()),
|
_values(std::vector<T>()),
|
||||||
_typeDesc( constraint->shortID() ),
|
_typeDesc( Constraint<T>::shortID(constraint) ),
|
||||||
_constraint( constraint ),
|
_constraint( constraint ),
|
||||||
_allowMore(false)
|
_allowMore(false)
|
||||||
{
|
{
|
||||||
|
@ -302,7 +302,7 @@ ValueArg<T>::ValueArg(const std::string& flag,
|
|||||||
: Arg(flag, name, desc, req, true, v),
|
: Arg(flag, name, desc, req, true, v),
|
||||||
_value( val ),
|
_value( val ),
|
||||||
_default( val ),
|
_default( val ),
|
||||||
_typeDesc( constraint->shortID() ),
|
_typeDesc( Constraint<T>::shortID(constraint) ),
|
||||||
_constraint( constraint )
|
_constraint( constraint )
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
@ -318,7 +318,7 @@ ValueArg<T>::ValueArg(const std::string& flag,
|
|||||||
: Arg(flag, name, desc, req, true, v),
|
: Arg(flag, name, desc, req, true, v),
|
||||||
_value( val ),
|
_value( val ),
|
||||||
_default( val ),
|
_default( val ),
|
||||||
_typeDesc( constraint->shortID() ), // TODO(macbishop): Will crash
|
_typeDesc( Constraint<T>::shortID(constraint) ), // TODO(macbishop): Will crash
|
||||||
// if constraint is NULL
|
// if constraint is NULL
|
||||||
_constraint( constraint )
|
_constraint( constraint )
|
||||||
{
|
{
|
||||||
|
@ -6,7 +6,7 @@ cd $DIR
|
|||||||
|
|
||||||
let "suc = 0"
|
let "suc = 0"
|
||||||
let "fail = 0"
|
let "fail = 0"
|
||||||
NUMTEST=87
|
NUMTEST=89
|
||||||
|
|
||||||
for (( tno = 1 ; $tno <= $NUMTEST ; tno = $tno + 1 )); do
|
for (( tno = 1 ; $tno <= $NUMTEST ; tno = $tno + 1 )); do
|
||||||
./testCheck.sh $tno
|
./testCheck.sh $tno
|
||||||
|
1
tests/test89.out
Normal file
1
tests/test89.out
Normal file
@ -0,0 +1 @@
|
|||||||
|
Passed
|
9
tests/test89.sh
Normal file
9
tests/test89.sh
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
../examples/test28 > tmp.out 2>&1
|
||||||
|
|
||||||
|
if cmp -s tmp.out $srcdir/test89.out; then
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
exit 1
|
||||||
|
fi
|
Loading…
x
Reference in New Issue
Block a user