⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bugfix80.txt

📁 PC-Lint是一种静态代码检测工具
💻 TXT
📖 第 1 页 / 共 4 页
字号:
*   We now recognize namespace std by default (i.e. without an explicit
    'using namespace std;' statement) when the -cgnu option (the option
    to specify gcc as the compiler) is given, to conform with the
    expectations of that compiler.


*************** Version 8.00h 6/25/2002 ***************

*   An instantiation of a template bearing an inline function
    within a class member function could cause unqualified name lookup
    to go awry.  In the following s was not found.
    template <class T> struct A
	{ int s; void f() { s = 0; } };
    struct B { void g( void ); };
    void B::g( void ) { A<int> x; }

*   Message 1053 (function cannot be distinguished from another) is
    now accompanied with the minor type differences leading to the message.

*   We were not producing any message when a declaration of a function
    declared the function to be inline whereas a prior definition of
    the function did not indicate that it was inline.

*   We were not recognizing an operator+ after it was defined as a
    friend function of a template specialization X<t>.  We would
    recognize operator+ in the first module that instantiated X<t>
    but not in subsequent modules.  This was because we were not
    reactivating friend functions declarations for subsequent modules.

*   We were not processing Visual Studio 6.0 project files (.dsp files)
    as well as we should.  In particular options appropriate to only
    a single module were being triggered in the order of appearance
    in the .dsp file.  The result was that these options came after
    the module name which was too late to be of any good.

*   We were processing .vcp files as if they were .vcproj files
    rather than as .dsp files.

*   We were not reporting when the address of a (non-reference) parameter
    was being returned.

*   We were not producing declarations of static functions when the
    -odi() option was used.

*   We were not allowing blanks within the -e{...} option.

*   We no longer give message 944 by default during specific walks

*   We were giving an undeserved Error 58 (bad type) when comparing
    ptr-to-member's

*   We were giving an undeserved 1764 (reference parameter could be
    declared const) when the reference parameter (r) was used in the
    following way:   r.*x = expression;

*   A pointer used on the left-hand side of a ->* operator would
    not get credited with an access.  Thus the expression
	(p->*pmf)(arguments);
    would not be sufficient to suppress Warning 550 (symbol p not
    accessed).

*   We were issuing an undeserved Info 1764 (Reference parameter
    could be made const) when its only use was in the call of a member
    function through a pointer to member function.  E.g.
	void f( C &r, void (C::*f)() ) { (r.*f)(); }
    would result in a 1764

*   A parameter declared Pointer-to-member-function would receive an
    unjustified 818 (pointer could be made const).

*   We would report an 'inconsistent structure definition' for a class
    within a lob that contained a template function member.

*   We were issuing an unjustified Corrupt Lob (Error 304, code 26)
    when a template function was called where the function sprang
    from a partial specialization.

*   We were issuing an unjustified Error 126 (inconsistent structure
    definition) when processing 2 or more .lob files that were produced
    by C (as opposed to C++) modules that contained nested struct's.

*   We were issuing an unjustified Error 126 (inconsistent structure
    definition) when processing 2 or more .lob files that contained
    untagged enum's that were not identical.  Our flaw was that we
    were making them identical when they were not and reporting the
    inconsistency at lob time.

*   We were looping on the following constant: 0.0e-999999
    In general, whenever there was a 0 value with a huge exponent
    we could loop.

*   We were giving an undeserved 304 (Corrupt Object file) code 28
    when linting a lob that contained a class that had both a function
    and a function template by the same name.  Such a condition prevailed
    in OLE.


*************** Version 8.00g 4/10/2002 ***************

*   You can now suppress message 126 with an -esym.

*   We no longer append a useless blank to "module" verbosity message.

*   Enhanced the env-xml.lnt file so that xml escapes would be employed
    for xml meta-characters.

*   Added the +fet flag (Explicit Throw) flag.  See readme

*   We were failing to deduce that after a successful test for
    x > 3 that x could no longer be 0.

*   An 'improvement' in our unqualified name lookup introduced in
    8.00f had a slight bug that would evidence itself when a function
    defined outside of its namespace was declared to return a pointer
    or reference.  E.g.
       namespace X { struct S { int *f(); }; }
       int *X::S::f() { int a; ...  }
    a would be considered defined within namespace X.

*   We were issuing an undeserved Error 64 when initializing a reference
    with a reference to a type that differs in some way from, but could
    be converted to, the target type.

*   We were not finding all source file names in .vcproj files.
    We were triggering off the attribute: name = "Source Files";
    but this is not that reliable as other names can be used.  We now
    trigger off extensions.

*   We were not properly truncating casts during value tracking.
    Thus information losing casts would retain their original values.

*   We were giving an undeserved Error 64 when an attempt was made
    to assign a pointer to a bool.  This is perfectly valid code and
    now draws only the usual implicit conversion messages.

*   We were not handling the .NET keywords __if_exists() and
    __if_not_exists() properly.  Although referred to as statements
    it seems they can appear anywhere in the source code, within
    classes, within initializers, etc., and not just within code blocks.

*   Unqualified name lookup in a constructor initializer would create
    a problem if the namespace depths become deep enough.  E.g. in the
    constructor definition:
       A::B::C::X::X() : B::X(3) {}
    where A, B, and C are namespaces, we would not find B.
    this had worked in patch levels prior to 8.00f.

*   We were converting bools b1 and b2 in the following expression to int.
      predicate ? b1 : b2
    According to the standard the result is a bool not an int.

*************** Version 8.00f 3/18/2002 ***************

*   We were not rewalking (in subsequent passes) class member functions
    defined in the class.

*   We were not rewalking instances of template functions in subsequent
    passes.

*   We were not rewalking template member functions in subsequent passes.

*   When there is a repeated definition of a template specialization
    as in:
	template<> class A<long> {};
	template<> class A<long> {};
    we correctly issued an Error 39 but the location we cited as being
    in conflict was the new location not the old location.  This has
    now been fixed.

*   We were sometimes not finding the correct namespace when a global
    scope operator was provided.  e.g.
      namespace A { class X {}; }
      namespace B { namespace A { class Y{}; } class Z { void f(); }; }
      void B::Z::f() { ::A::X n; }  /* we can't figure out ::A::X */

*   There was no way for a user to totally suppress #error messages.
    Now if you give the +fce (continue on #error flag) AND suppress
    message 309 with -e309 you will continue on as if nothing happened.

*   The flag +fdh (add .h by default for #include "name" where name does
    not have an extension) previously did not work with Unix systems.

*   Our unqualified name lookup has been improved so that we can pick
    up identifiers not only in the namespace bearing a function but
    in any containing namespace as well.  For example we were not
    finding the "i" in the following return statement:
	namespace A { int i; namespace B { int f(); } }
	int A::B::f() { return i; }

*   We were issuing a 304 (Corrupt Object file), code 23 for a template
    that was involved in an expression where the template arguments were
    somewhat intricate.  The smallest example causing the problem was:
	template <class E> class V { typedef V<E> y; };
	typedef V< V<int> > B;
	typedef V< V<B*> > C;
	B b;

*   We were issuing an undeserved 429 (custodial pointer not freed)
    during a specific walk of a function that was handed a pointer
    that was custodial in the caller.

*   Given two consecutive calls with partial lists of explicit template
    arguments could result in the wrong function.  E.g
      template <class T, class S> T f(S);
      double y = f<double>(0);    /* ok uses f<double,int> */
      long x = f<long>(0);        /* bad, still uses f<double,int> */

*   We were looping during the delete of class A that contained a
    member typed T<A> which in turn had a reference to A as a member.

*   When -emacro was applied to a macro which began a default
    argument the error suppression would not take place.  E.g.
    //lint +e1924 -emacro(1924,M)  warn about C style casts except in M
    #define M (int) 10
    template< int k = M > class A { int x[M]; };
    A<> a;    /* Issues a 1924 anyway */

*   We were occasionally issuing an undeserved Error 40 when processing
    member declaration within a class template.  The declaration includes
    the sequence:
	    ... typename qualified-name declarator;
    The Error 40 was somewhat random and 'typename' was necessary.

*   We were not allowing a function (declared to return void) to
    return an expression typed void

*   volatile variables are not assumed to hold values assigned to them
    with probability one.  Variables that are const volatile and
    initialized are not assumed to hold the const variable property.

*   We now support template nontype reference parameters and
    pointer parameters semantically and not just syntactically.

*   a MISRA rule 42 warning (avoid use of comma operator) was not
    suppressed in the top-level for clause.

*   We were issuing an unjustified 957 (Function defined without a
    prototype in scope) when a static member of a namespace was being
    defined as in:
	static void N::f() {}

*   We now support template member operators.  E.g.
	template <class T> class C {
	    template<class U> int operator==(U); };

*   We were giving an undeserved Info 768 (global member not referenced)
    for a template member even though the member was referenced in
    an externally defined function member.

*   We were not handling complex macros in the #include syntax.
    For example,
	#include macro(name)
    where macro evaluates to an angle-bracketed expression.
    This had been working prior to 7.50o.

*   We were not giving a divide by zero warning when a float was
    being divided by an integer.

*   We are now processing VC7 project files (extension .vcproj)
    producing an equivalent .lnt file (similar to .dsp).

*   We now support the Microsoft __if_exists and __if_not_exists
    keywords introduced with .net

*   We are getting an undeserved Warning 650 (Constant out of range)
    when a bit field contains an enumeration and is compared with
    an enumerator even though the +fbu (bitfields are unsigned) flag
    has been set

*   The Gnu reduced variant of the ?: operator, e.g.
	a = f() ? : -1;
    is supported.

*   The Microsoft attribute designation using [ ... ] before a
    type specifier is supported.

*   We were issuing an unjustified 1001 (X must be struct or class)
    for the following:
	template< class T > class A : public T::X::Y {};
    The message was benign as it did not prevent us from instantiating
    A properly.

*   We were issuing an unjustified 1070 when processing ATL (the Active
    Template Library).  The cause was traced to our inclination to
    unnecessarily instantiate template arguments.  Thus in:
	A< B<x> > a;
    there is normally a need to instantiate A< > with the appropriate
    type but not B< >.

*   We now support unnamed template parameters as in:
	template< class = int > class A {};

*   We now support template template parameters.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -