Refs #320. Refactored the XCP Seed and Key shared library. Its build system is now based on CMake and it is cross-platform.

git-svn-id: https://svn.code.sf.net/p/openblt/code/trunk@379 5dc33758-31d5-4daf-9ae8-b24bf3d40d73
This commit is contained in:
Frank Voorburg 2017-10-24 13:56:03 +00:00
parent 40f5406c80
commit 88855a5f7a
40 changed files with 4827 additions and 238 deletions

2493
Doc/doxygen/DoxyfileSeedNKey Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,15 @@
:: Batch file to generate a reference manual from the comments in the source code, with
:: Doxygen. The following tools should be installed and added to the path:
:: - DoxyGen (doxygen.exe)
:: - Graphviz (dot.exe)
:: - MikTex (pdflatex.exe)
:: - HTML Help Workshop compiler (hhc.exe)
if exist ..\RM_SeedNKey.pdf del ..\RM_SeedNKey.pdf
if exist ..\RM_SeedNKey.chm del ..\RM_SeedNKey.chm
doxygen.exe DoxyfileSeedNKey
call .\output\SeedNKey\latex\make.bat
call copy .\output\SeedNKey\latex\refman.pdf ..\RM_SeedNKey.pdf
:: Remove the comment on the next line to automatically open the generated PDF file
:: call start "C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe" ..\RM_SeedNKey.pdf
:: Remove the comment on the next line to automatically open the generated CHM file
:: start .\..\RM_SeedNKey.chm

Binary file not shown.

View File

@ -365,7 +365,7 @@ begin
// create ini file object
settingsIni := TIniFile.Create(iniFile);
FSeedKeyDll := settingsIni.ReadString('xcp', 'seedkey', ExtractFilePath(ParamStr(0))+'FeaserKey.dll');
FSeedKeyDll := settingsIni.ReadString('xcp', 'seedkey', ExtractFilePath(ParamStr(0))+'libseednkey.dll');
// if no path specified, then assume dll is located in the executable's path
if ExtractFilePath(FSeedKeyDll) = '' then

View File

@ -1,121 +0,0 @@
/************************************************************************************//**
* \file SeedNKey.cpp
* \brief XCP Seed/Key algorithms
* \internal
*----------------------------------------------------------------------------------------
* C O P Y R I G H T
*----------------------------------------------------------------------------------------
* Copyright (c) 2014 by Feaser http://www.feaser.com All rights reserved
*
*----------------------------------------------------------------------------------------
* L I C E N S E
*----------------------------------------------------------------------------------------
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You have received a copy of the GNU General Public License along with OpenBLT. It
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
*
* \endinternal
****************************************************************************************/
#ifdef __cplusplus
extern "C"
{
#endif
/****************************************************************************************
* Type definitions
****************************************************************************************/
typedef unsigned char BYTE;
typedef unsigned long DWORD;
/****************************************************************************************
* Defines
****************************************************************************************/
/* XCP dll function type info */
#define XCP_DLL_EXPORT __declspec(dllexport) __cdecl
/* XCP supported resources */
#define kXcpResPGM 0x10 /* ProGraMing */
#define kXcpResSTIM 0x08 /* data STIMulation */
#define kXcpResDAQ 0x04 /* Data AcQuisition */
#define kXcpResCALPAG 0x01 /* CALibration and PAGing */
/****************************************************************************************
** NAME: XCP_ComputeKeyFromSeed
** PARAMETER: resource : resource for which the unlock key is requested
** seedLen : length of the seed
** seedPtr : pointer to the seed data
** keyLenPtr: pointer where to store the key length
** keyPtr : pointer where to store the key data
** RETURN VALUE: 0: success, 1: error
** DESCRIPTION: Computes the key for the requested resource.
**
****************************************************************************************/
/************************************************************************************//**
** \brief Computes the key for the requested resource.
** \param resource resource for which the unlock key is requested
** \param seedLen length of the seed
** \param seedPtr pointer to the seed data
** \param keyLenPtr pointer where to store the key length
** \param keyPtr pointer where to store the key data
** \return 0 on success, otherwise 1.
**
****************************************************************************************/
DWORD XCP_DLL_EXPORT XCP_ComputeKeyFromSeed( BYTE resource, BYTE seedLen, BYTE *seedPtr,
BYTE *keyLenPtr, BYTE *keyPtr)
{
BYTE i;
/* Feaser XCP driver example key algorithm for PGM simply
* decrements the value of each seed by 1
*/
if ( resource == kXcpResPGM )
{
/* compute the key */
for ( i=0; i<seedLen; i++)
{
keyPtr[i] = seedPtr[i] - 1;
}
/* set the key length */
*keyLenPtr = seedLen;
/* done */
return 0;
}
/* still here, so the resource was unsupported */
return 1;
} /*** end of XCP_ComputeKeyFromSeed ***/
/************************************************************************************//**
** \brief Computes the key for the requested resource.
** \param resourcePtr pointer where to store the supported resources for the key
** computation.
** \return 0 on success, otherwise 1.
**
****************************************************************************************/
DWORD XCP_DLL_EXPORT XCP_GetAvailablePrivileges( BYTE *resourcePtr)
{
/* this dll supports key computation algorithm for the PGM resource */
*resourcePtr = (kXcpResPGM);
return 0;
} /*** end of XCP_GetAvailablePrivileges ***/
#ifdef __cplusplus
}
#endif
/*********************************** end of SeedNKey.cpp *******************************/

View File

@ -1,22 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Express 2013 for Windows Desktop
VisualStudioVersion = 12.0.31101.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SeedNKey", "SeedNKey.vcxproj", "{8292CD77-57FC-42DB-BE82-58ACD4A63BFD}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{8292CD77-57FC-42DB-BE82-58ACD4A63BFD}.Debug|Win32.ActiveCfg = Debug|Win32
{8292CD77-57FC-42DB-BE82-58ACD4A63BFD}.Debug|Win32.Build.0 = Debug|Win32
{8292CD77-57FC-42DB-BE82-58ACD4A63BFD}.Release|Win32.ActiveCfg = Release|Win32
{8292CD77-57FC-42DB-BE82-58ACD4A63BFD}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@ -1,87 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<ItemGroup>
<ClCompile Include="SeedNKey.cpp" />
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{8292CD77-57FC-42DB-BE82-58ACD4A63BFD}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>SeedNKey</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v120</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v120</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
<OutDir>.\..\..\..\</OutDir>
<TargetName>FeaserKey</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;SEEDNKEY_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>Use</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;SEEDNKEY_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -0,0 +1,133 @@
#****************************************************************************************
# \file CMakeLists.txt
# \brief CMake descriptor file for the XCP Seed and Key shared library.
# \internal
#----------------------------------------------------------------------------------------
# C O P Y R I G H T
#----------------------------------------------------------------------------------------
# Copyright (c) 2017 by Feaser http://www.feaser.com All rights reserved
#
#----------------------------------------------------------------------------------------
# L I C E N S E
#----------------------------------------------------------------------------------------
# This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
# modify it under the terms of the GNU General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option) any later
# version.
#
# OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
# without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
# PURPOSE. See the GNU General Public License for more details.
#
# You have received a copy of the GNU General Public License along with OpenBLT. It
# should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
#
# \endinternal
#****************************************************************************************
# Specify the version being used aswell as the language
cmake_minimum_required(VERSION 2.8)
#****************************************************************************************
# Project configuration
#****************************************************************************************
# Specify the project name
project(seednkey)
# Build debug version by default
set(CMAKE_BUILD_TYPE "Debug")
#****************************************************************************************
# Options
#****************************************************************************************
# Add option with default value to disable the generation of the PC-lint target. It can
# be overridden on the command line when CMake is called using the following parameter:
# -DLINT_ENABLED=ON
option(LINT_ENABLED "Configurable to enable/disable the PC-lint target" OFF)
#****************************************************************************************
# Directories
#****************************************************************************************
# Set the output directory
set (PROJECT_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/../../..)
# Set the output directory for the generic no-config case (e.g. with mingw)
set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_OUTPUT_DIRECTORY} )
set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_OUTPUT_DIRECTORY} )
set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_OUTPUT_DIRECTORY} )
# Set the output directory for multi-config builds (e.g. msvc)
foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} )
string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG )
set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${PROJECT_OUTPUT_DIRECTORY} )
set( CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${PROJECT_OUTPUT_DIRECTORY} )
set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${PROJECT_OUTPUT_DIRECTORY} )
endforeach( OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES )
#****************************************************************************************
# Compiler flags
#****************************************************************************************
# Set platform specific compiler macro PLATFORM_XXX
if(WIN32)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DPLATFORM_WIN32 -D_CRT_SECURE_NO_WARNINGS")
elseif(UNIX)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DPLATFORM_LINUX -std=gnu99")
endif(WIN32)
#***************************************************************************************
# Includes
#****************************************************************************************
# Set include directories
include_directories("${PROJECT_SOURCE_DIR}")
#***************************************************************************************
# Files
#****************************************************************************************
# Get header files from the root directory
file(GLOB INCS_ROOT "*.h")
set(INCS ${INCS_ROOT})
# Add sources
set(
LIB_SRCS
seednkey.c
${INCS}
)
#***************************************************************************************
# Targets
#****************************************************************************************
# Set main target. Use "make seednkey_shared" to individually build the shared library.
add_library(seednkey_shared SHARED ${LIB_SRCS})
if(CMAKE_C_COMPILER_ID MATCHES MSVC)
# Microsoft Visual Studio does not add "lib" to the name of the DLL, whereas GCC
# (including MinGW) does. Correct this here.
SET_TARGET_PROPERTIES(seednkey_shared PROPERTIES OUTPUT_NAME libseednkey CLEAN_DIRECT_OUTPUT 1)
else()
SET_TARGET_PROPERTIES(seednkey_shared PROPERTIES OUTPUT_NAME seednkey CLEAN_DIRECT_OUTPUT 1)
endif()
# Only generate the PC-lint taget if the option is enabled. Use "make seednkey_LINT" to
# lint the project sources
if(LINT_ENABLED)
# Include PC-lint configuration file for the correct compiler. Currently GNU GCC and
# Microsoft Visual Studio are supported.
if(CMAKE_C_COMPILER_ID MATCHES GNU)
include(${PROJECT_SOURCE_DIR}/lint/gnu/pc_lint.cmake)
elseif(CMAKE_C_COMPILER_ID MATCHES MSVC)
include(${PROJECT_SOURCE_DIR}/lint/msvc/pc_lint.cmake)
endif()
# Generate the PC-lint target.
if(COMMAND add_pc_lint)
add_pc_lint(seednkey ${LIB_SRCS})
endif(COMMAND add_pc_lint)
endif(LINT_ENABLED)
#*********************************** end of CMakeLists.txt ******************************

View File

@ -0,0 +1,129 @@
// ---------------------------------------------------------------------
// This file is provided by Gimpel Software (www.gimpel.com) for use with
// its products PC-lint and FlexeLint.
//
// Redistribution and use of this file, with or without modification, is
// permitted provided that any such redistribution retains this notice.
// ---------------------------------------------------------------------
#ifndef CO_GCC_H_
#define CO_GCC_H_
/*lint -save -w1 */
#ifdef _lint /* Make sure no compiler comes this way */
#ifdef __cplusplus
extern "C" {
#endif
/* Standard library headers typically define the assert macro so that it
expands to a complicated conditional expression that uses special
funtions that Lint does not know about by default. For linting
purposes, we can simplify things a bit by forcing assert() to expand to
a call to a special function that has the appropriate 'assert'
semantics.
*/
//lint -function( __assert, __lint_assert )
void __lint_assert( int );
//lint ++d"assert(e)=__lint_assert(!!(e))"
//(++d makes this definition permanently immutable for the Lint run.)
//Now that we've made our own 'assert', we need to keep people from being
//punished when the marco in 'assert.h' appears not to be used:
//lint -efile(766,*assert.h)
typedef char *__builtin_va_list;
/*lint -e{171} */
__builtin_va_list __lint_init_va(...);
void __builtin_va_end( __builtin_va_list );
/*lint
++d"__builtin_va_start(ap,parmN)=((ap)=__lint_init_va(parmN))"
++d"__builtin_va_arg(a,b)=(*( ((b) *) ( (((a) += sizeof(b)) - sizeof(b) )))"
*/
/*
The headers included below must be generated; For C++, generate
with:
g++ [usual build options] -E -dM t.cpp >lint_cppmac.h
For C, generate with:
gcc [usual build options] -E -dM t.c >lint_cmac.h
...where "t.cpp" and "t.c" are empty source files.
It's important to use the same compiler options used when compiling
project code because they can affect the existence and precise
definitions of certain predefined macros. See gcc-readme.txt for
details and a tutorial.
*/
#if defined(__cplusplus)
# include "lint_cppmac.h" // DO NOT COMMENT THIS OUT. DO NOT SUPPRESS ERROR 322. (If you see an error here, your Lint configuration is broken; check -i options and ensure that you have generated lint_cppmac.h as documented in gcc-readme.txt. Otherwise Gimpel Software cannot support your configuration.)
#else
# include "lint_cmac.h" // DO NOT COMMENT THIS OUT. DO NOT SUPPRESS ERROR 322. (If you see an error here, your Lint configuration is broken; check -i options and ensure that you have generated lint_cmac.h as documented in gcc-readme.txt. Otherwise Gimpel Software cannot support your configuration.)
#endif
/* If the macro set given by the generated macro files must be adjusted in
order for Lint to cope, then you can make those adjustments here.
*/
#define LINT_CO_GCC_H_GCC_VERSION ( __GNUC__ * 10000 + \
__GNUC_MINOR__ * 100 + \
__GNUC_PATCHLEVEL__ )
/* The following is a workaround for versions of GCC with bug 25717, in
which the preprocessor does not dump a #define directive for __STDC__
when -dM is given:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25717
We know the unconditional definition of __STDC__ was introduced no
later than version 3.0; the preprocessor bug was fixed no later than
version 4.1.0.
*/
#if ( LINT_CO_GCC_H_GCC_VERSION >= 30000 && \
LINT_CO_GCC_H_GCC_VERSION < 40100 )
# define __STDC__ 1
#endif
#if !__cplusplus && !__STRICT_ANSI__ && __STDC_VERSION__ < 199901L
/* apparently, the code is compiled with -std=gnu89 (as opposed to -std=c89),
so: */
/*lint -rw_asgn(inline,__inline) */
#endif
#if LINT_CO_GCC_H_GCC_VERSION >= 40300
# define __COUNTER__ __lint__COUNTER__
//lint +rw( *type_traits ) // Enable type traits support
#endif
#ifdef __cplusplus
} /* extern "C" */
#endif
#if _lint >= 909 // For 9.00i and later:
//// __attribute__ is GCC's __attribute__:
//
//lint -rw_asgn(__attribute__,__gcc_attribute__)
//lint -rw_asgn(__attribute, __gcc_attribute__)
//
//// Prevent "__attribute__" from being defined as a macro:
//
//lint --u"__attribute__"
//lint --u"__attribute"
//
//// Because an attribute-specifier is a form of
//// declaration-modifier, and because it can appear at the
//// beginning of a decl-specifier-seq, we must enable "Early
//// Modifiers":
//
//lint +fem
#else // for 9.00h and earlier:
//lint -d__attribute__()=
//lint -d__attribute()=
#endif
#endif /* _lint */
/*lint -restore */
#endif /* CO_GCC_H_ */

View File

@ -0,0 +1,212 @@
/* Date Stamp */ -d"_lint_co_gcc_lnt=co-gcc.lnt modified 12-Jun-2014"
/* To document usage use: -message( "Using " _lint_co_gcc_lnt ) */
// ---------------------------------------------------------------------
// This file is provided by Gimpel Software (www.gimpel.com) for use with
// its products PC-lint and FlexeLint.
//
// Redistribution and use of this file, with or without modification, is
// permitted provided that any such redistribution retains this notice.
// ---------------------------------------------------------------------
/* co-gcc.lnt: This is the seed file for configuring Lint for use with
GCC versions 2.95.3 and later.
Like all compiler options files this file is intended to be used
as follows:
lint co-gcc.lnt source-files-to-be-linted
Some of the information that co-gcc.lnt requires needs to be furnished
with the help of the gcc system itself. The easiest way to generate
this information is to use the makefile co-gcc.mak (supplied with the
Lint distribution) in an invocation of GNU Make; for details, see the
commentary at the top of co-gcc.mak.
*/
-cgnu // Notifies FlexeLint that gcc is being used.
// ===========================
// Preprocessor Configuration:
+fdi // GCC starts its #include search in the directory of the including
// file.
++fln // Allow:
// # digit-sequence " [s-char-sequence] " new-line
// as a synonym for:
// # line digit-sequence " [s-char-sequence] " new-line
// GCC additionally allows flag values to follow the
// s-char-sequence, but currently Lint ignores them.
-header(co-gcc.h) // Includes headers generated by GCC (bringing in
// predefined macros).
+libh(co-gcc.h) // Marks that header as library code.
gcc-include-path.lnt // This .lnt file should contain --i options
// and should be generated by invoking gcc with its '-v' option.
// (GCC's implicit #include search path is presented in the output.)
// This happens automatically when 'make -f co-gcc.mak' is invoked.
// Assertion directives (a feature of GCC's preprocessor) have been
// considered obsolete in GCC's documentation since version 3.0, so we do
// not use them here. If support for #assert is needed in the form of a
// lint option, one may use '-a#' like so:
// -a#machine(i386) // #assert's machine(i386) (SVR4 facility).
// File extensions:
// From the GCC man page:
//
// file.cc
// file.cp
// file.cxx
// file.cpp
// file.CPP
// file.c++
// file.C
// C++ source code that must be preprocessed. Note that in .cxx, the
// last two letters must both be literally x. Likewise, .C refers to
// a literal capital C.
//
// We emulate this with:
+cpp(.cc)
+cpp(.cp)
+cpp(.cxx)
+cpp(.cpp)
+cpp(.c++)
// Note the exceptions:
// +cpp(.CPP)
// +cpp(.C)
// These are commented out for the default config because they seem to
// cause trouble more often than not. For starters, it is problematic
// with filesystems that are case-insensitive (which has become common
// even on some POSIX systems).
// =============
// Size Options:
// +fwc // wchar_t might be builtin; if so, uncomment this option. (NOTE:
// // this option needs to be set before a size option is given for
// // wchar_t; see the documentation for -sw# in the Lint manual.)
size-options.lnt // This .lnt file should be generated (preferrably
// by a program created by invoking GCC with the compile options that
// are used in the compilation of the project to be linted). This
// happens automatically when 'make -f co-gcc.mak' is invoked.
// ===========================================
// +rw and -d options to cope with GNU syntax:
+ppw(ident) // Tolerate #ident
+ppw(warning)
// GCC provides alternative spellings of certain keywords:
+rw(__inline)
-rw_asgn(__inline__,__inline)
-rw_asgn(__header_always_inline,__inline)
-rw_asgn(__header_inline,__inline)
-rw_asgn(__signed__,signed)
-rw_asgn(__signed,signed)
-rw_asgn( __volatile__, volatile )
-rw_asgn( __volatile, volatile )
+rw(restrict)
-rw_asgn(__restrict,restrict)
-rw_asgn(__restrict__,restrict)
++d"__const=const" // gconv.h uses __const rather than const
++d"const=const" // ensure const expands to const.
-rw_asgn( asm, _up_to_brackets )
-rw_asgn( __asm, _up_to_brackets )
-rw_asgn( __asm__, _up_to_brackets )
// This re-definition of the various spellings of the asm keyword enables
// Lint to pass gracefully over expression-statements like:
// __asm __volatile ("fsqrt" : "=t" (__result) : "0" (__x));
// But it may be necessary to suppress certain error messages that are
// triggered by tokens that are part of an assembly declaration or
// statement. For example:
-d"__asm__(p...)=/*lint -e{19}*/ __asm__(p)"
// ...causes Lint to be quiet about the semicolon that follows an
// __asm__() declaration. Note, the -e{N} form of suppression takes
// effect only for the forward-declaration, definition or
// [possibly-compound] statement that immediately follows. Because a
// semicolon is seen as a declaration-terminator, Error 19 will be
// re-enabled immediately after the semicolon in '__asm__(...);'.
// (The elipsis after the macro parameter p allows zero or more commas to
// appear in the operand.)
//
// If you encounter other diagnostics that appear to need suppression in
// or near assembly regions, please let us know!
//
-esym(123,__asm__)
-rw_asgn(__alignof__,__alignof)
// "__extension__" is GCC's way of allowing the use of non-standard
// constructs in a strict Standard-conforming mode. We don't currently
// have explicit support for it, but we can use local suppressions. For
// example, we can use -e(160) so that we will not see any Errors about
// GNU statement-expressions wrapped in __extension__().
++d"__extension__=/*lint -e(160) */"
++d"__null=0"
+rw(_to_semi) // needed for the two macros above.
+rw(__typeof__) // activate __typeof__ keyword
-d"__typeof=__typeof__" // an alternative to using __typeof__
-rw(__except) // This MS reserved word is used as an identifier
+rw( __complex__, __real__, __imag__ ) // reserved words that can be ignored.
++d"__builtin_strchr=(char*)" // permits the inline definition ...
++d"__builtin_strpbrk=(char*)" // of these functions to be linted ...
++d"__builtin_strrchr=(char*)" // without drawing a complaint
++d"__builtin_strstr=(char*)" // about the use of a non-standard name
++d"__PRETTY_FUNCTION__=___function___" // lint defines ___function___ internally
++d"__FUNCTION__=___function___" // lint defines ___function___ internally
++d"__func__=___function___" // Some C++ modes suport the implicit __func__
// identifier.
-ident($)
// =========================================================
// Other options supporting GNU C/C++ syntax:
+fld // enables the processing of _L_abel _D_esignators E.g.:
// union { double d; int i; } u = { d: 3.141 };
// =========================================================
// Generally useful suppressions:
-wlib(1) // sets the warning level within library headers to 1
// (no warnings, just syntax errors). Comment out if you
// are actually linting library headers.
-elib(123) // 123 is really a warning, but it's in the "Error" range.
-elib(93) // allow newlines within quoted string arguments to macros
-elib(46) // allow bit fields to have integral types other than
// '_Bool' and 'int'.
-elibsym(793) // suppress warning about limit of 31 significant characters
-elibsym(628) // Suppress 628 for __builtin symbols.
-esym(528,__huge_val,__nan,__qnan,__qnanf,__snan,__snanf)
// We don't care if we don't reference some GNU functions
-esym(528,__gnu_malloc,__gnu_calloc)
// The following functions exhibit variable return modes.
// That is, they may equally-usefully be called for a value
// as called just for their effects. Accordingly we inhibit
// Warning 534 for these functions.
// Feel free to add to or subtract from this list.
-esym(534,close,creat,fclose,fprintf,fputc)
-esym(534,fputs,fscanf,fseek,fwrite,lseek,memcpy,memmove,memset)
-esym(534,printf,puts,scanf,sprintf,sscanf,strcat,strcpy)
-esym(534,strncat,strncpy,unlink,write)
// For non-ANSI compilers we suppress messages 515 and 516
// for functions known to have variable argument lists.
// For ANSI compilers, header files should take care of this.
-esym(515,fprintf,printf,sprintf,fscanf,scanf,sscanf)
-esym(516,fprintf,printf,sprintf,fscanf,scanf,sscanf)
-esym(1702,*operator<<,*operator>>)
-esym(534,*operator<<,*operator>>)
-esym(1055,*__builtin*)
-esym(718,*__builtin*) // The compiler does not need these ...
-esym(746,*__builtin*) // declared and it knows their prototypes.
-esym(793, pthread_mutexattr_getprioceiling, pthread_mutexattr_setprioceiling)

View File

@ -0,0 +1,6 @@
--i/usr/lib/gcc/x86_64-linux-gnu/6/include
--i/usr/local/include
--i/usr/lib/gcc/x86_64-linux-gnu/6/include-fixed
--i/usr/include/x86_64-linux-gnu
--i/usr/include

View File

@ -0,0 +1,319 @@
Using FlexeLint with GCC
These notes describe how to use the option file co-gcc.lnt which serves
as a replacement for the older co-gnu.lnt and co-gnu3.lnt options files.
--- Quick Start ---
If you just want a quick-and-dirty Lint configuration (one that enables
you to use Standard Library headers and system headers) then use the
makefile 'co-gcc.mak' (supplied with the Lint distribution) in an
invocation of GNU Make like so:
make -f co-gcc.mak
... which should generate the following files (provided that 'gcc', 'g++'
and 'awk' are each found in your $PATH):
lint_cmac.h
lint_cppmac.h
gcc-include-path.lnt
size-options.lnt
(co-gcc.lnt depends on these files, so they must be generated before you
do anything else.)
That's it! You should now be able to run:
flint co-gcc.lnt [source files]
Note that Lint must be able to find co-gcc.lnt and the files referenced
therein. If you want to keep them in a separate directory (e.g.,
/usr/local/etc/flint) from the one where you will invoke Lint (e.g.,
~/some-project/src), you'll need to specify the former with a '-i' option
so that Lint will know where to look. In that case, the invocation would
look like:
flint -i /usr/local/etc/flint co-gcc.lnt [source files]
If your project is compiled without any explicit command-line switches
other than '-c' then this invocation alone might be all that you need to
get started linting your project. Otherwise it probably won't suffice.
For a Lint configuration that better matches the way you compile your
code, you should at least read the 'usage' note at the top of co-gcc.mak.
For a motivation for the contents of co-gcc.mak, and to better understand
the configuration issues in general, please read on.
--- Introduction ---
The configuration of Lint for use with GCC-compiled sources is complicated
by two major issues:
First, GCC defines a large number of preprocessor macros internally (i.e.,
it defines a lot of macros for which there are no '#define' directives in
any source file that Lint can read.). Unless this issue is resolved for
each project, Lint will not see the same sequence of C/C++ tokens as GCC
when it tries to analyze your program, and as a result it will not see the
same set of declarations; consequently you'll see lots of spurious
messages because the analysis will reflect that of a program that is
truly ill-formed (unlike the program seen by GCC).
Second, GCC is aware of several built-in functions. Most of them can be
presented to Lint as ordinary forward-declarations of functions so as to
avoid undesired diagnostics claiming that these functions were not
declared before the first point of use. Note, these declarations do not
necessarily need to be presented to GCC.
--- Solving the Preprocessor Problem ---
Before we get started, we'll need an empty C source file. Call it
'empty.c' and save it to disk. Next, use your favorite command
interpreter environment (such as sh in Unix-like environments or cmd.exe
on Windows) and go to the directory containing 'empty.c'. Verify that you
can run GCC by doing the following:
gcc -v
If your environment is properly set up you should see a version string.
(You'll also want to verify that this is the same GCC executable used to
compile your sources; check the PATH environment variable or try running
'which gcc'.)
Assuming that worked, you can now try the following (and note that case,
as with C/C++ identifiers, is important.):
gcc -E -dM empty.c
On one system, we then see definitions like:
#define __DBL_MIN_EXP__ (-1021)
#define __FLT_MIN__ 1.17549435e-38F
#define __DEC64_DEN__ 0.000000000000001E-383DD
... followed by about a hundred more '#define' directives. What just
happened? We passed two options to gcc; the first one, '-E', means,
"don't run the compiler; just run the preprocessor". The option '-dM'
(not to be confused with '-DM', which is completely different) means,
"don't generate preprocessor output; instead, only dump all macro
definitions, including those defined internally".
With this output, we are now halfway to the point of having a preprocessor
configuration for Lint. First, let's redirect those macros to a file:
gcc -E -dM empty.c >lint_cmac.h
Next, let's test our configuration: make a simple C source file
containing the "Hello, world" program in a file called 't.c' (in the same
directory as 'empty.c')
#include <stdio.h>
int main () {
printf( "hello, world!\n" );
}
To lint this program, first copy the lnt file (co-gcc.lnt) and the
associated header (co-gcc.h) into the same directory. Next, create two
new empty files:
size-options.lnt
gcc-include-path.lnt
... and save them to disk. Then make a file called 'std.lnt' which will
(at first) contain only:
co-gcc.lnt
This tells Lint, "process the arguments in co-gcc.lnt". Two of those
arguments are:
-header(co-gcc.h) // #include's headers generated by GCC.
+libh(co-gcc.h) // Marks co-gcc.h as library code.
'-header(co-gcc.h)' means "behave as if each primary source file began
with '#include "co-gcc.h"'. (Note that co-gcc.h includes "lint_cmac.h"
when Lint runs in C language mode.)
Finally, try running:
/path/to/flint std.lnt t.c
... or, on Windows:
[drive-letter]:\path\to\lint-nt std.lnt t.c
Next we'll see output similar to the following:
FlexeLint for C/C++ (Unix/386) Vers. 9.00c, Copyright Gimpel Software
1985-2009
--- Module: t.c (C)
_
#include <stdio.h>
t.c 3 Error 322: Unable to open include file 'stdio.h'
What went wrong? The problem is that we haven't yet addressed the other
half of the preprocessor configuration, namely: the ordered sequence of
directories to search for system headers. Fortunately GCC already knows
this list and gives us a way to discover it. Just run:
gcc -c -v empty.c
On one system (specifically, Mac OS X on Intel), that yields a lot of
verbose output including these lines:
#include "..." search starts here:
#include <...> search starts here:
/usr/local/include
/usr/lib/gcc/i686-apple-darwin8/4.0.1/include
/usr/include
/System/Library/Frameworks
/Library/Frameworks
End of search list.
(Naturally, that list will look a bit different in different
environments.) To make Lint search for system headers in the same way, we
need to take that output from GCC and use it to make a set of options of
the form --i[directory]. E.g. on the same system, that means that in
gcc-include-path.lnt, I should place the following --i options:
--i/usr/local/include
--i/usr/lib/gcc/i686-apple-darwin8/4.0.1/include
--i/usr/include
--i/System/Library/Frameworks
--i/Library/Frameworks
(Note, arguments to Lint are processed in order, so the --i options must
appear before t.c or they will not take effect in time.)
In this case, none of the directory names contains a space, but if one of
them did we would have to surround its name with quotes as in:
--i"/usr/local/include"
Now let's try linting "hello, world" again:
/path/to/flint std.lnt t.c
This time we should see no error messages. Are we done yet? Not quite.
First, let's test our configuration against all of the C Standard Library
headers. Modify t.c to:
#include <assert.h>
#include <iso646.h>
#include <setjmp.h>
#include <stdio.h>
#include <time.h>
#include <ctype.h>
#include <limits.h>
#include <signal.h>
#include <stdlib.h>
#include <wchar.h>
#include <errno.h>
#include <locale.h>
#include <stdarg.h>
#include <string.h>
#include <wctype.h>
#include <float.h>
#include <math.h>
#include <stddef.h>
int main () {
printf( "hello, world!\n" );
}
... and try linting again:
/path/to/flint std.lnt t.c
This time you should see a number of messages; in particular, you should
see Info 766 issued for most of these headers since they were not used.
you may also see some legitimate warnings, and you may see an Error or two
about 'wchar_t'. (Note, if it seems as though your port of GCC recognizes
wchar_t as a keyword instead of an identifier then uncomment the use of
'+fwc' in your copy of co-gcc.lnt).
[NOTE: we should point out that the option -wlib(1) is in co-gcc.lnt for a
reason. Please note that we *strongly* recommend against the use of
options like -wlib(0) or -elib(*). If you see syntax error messages about
library header code, odds are that something is wrong with the Lint
configuration; so you'll do yourself no favors by silencing Lint when it
sees constructs that Lint's parser doesn't know how to handle. If you need
help with correcting your configuration, please check the Lint manual or
contact us.]
We should really be done now, right? Well, not quite. A remaining issue
is that the set of predefined macros (dumped into "lint_cmac.h" earlier)
depends not only on things like the target system and the version of GCC;
it also depends on the options that you pass to GCC when you compile your
program. E.g., if we invoke:
gcc -O3 -E -dM empty.c >lint_cmac.h
... then (with the version of GCC we tested) lint_cmac.h will no longer
contain a definition for the macro '__NO_INLINE__' and contains a new
definition for '__OPTIMIZE__'. So when you generate macros, you should be
careful to pass in the full set of options used when you compile.
Ideally, you should establish a target in your build system that
re-generates the predefined macro header whenever your build configuration
changes; that way you'll seldom need to think about it again and Lint's
preprocessor configuration will always match the compiler's.
Assuming you've generated the right set of predefined macros for your
build settings, you should now try Linting a single primary source file in
your project. Since we're just starting out, let's run with -w1 (i.e.,
with the warning level set to one) so that we can deal with any syntax
errors that pop up:
flint std.lnt -u -w1 some-project-file.c
Again, remember that syntax errors at this stage are likely due to a
misconfiguration; please check the Lint manual for likely remedies or
contact us if the solution is not obvious.
Once you've taken care of all syntax errors, try doing the same with all
project files. We recommend placing the name of each project file in a
.lnt file (often called project.lnt); e.g.:
file1.c
file2.c
[...etc.]
... and invoke Lint like so:
flint std.lnt -w1 project.lnt
When all syntax errors are resolved, you can begin turning on Warning
messages (i.e., those listed in section 17.4 of the Lint manual). You can
turn them on individually after '-w1' or you can instead use '-w2' and
then suppress the Warnings that are less severe. (For details on message
suppression, see section 5.2 of the Lint manual.)
At this point, you should be well-equipped to Lint any C program compiled
with GCC. However, C++ users have a couple more points to consider.
The command used to invoke GCC also affects the set of predefined macros.
Observe the difference in '#define' output when you invoke:
g++ -O3 -E -dM empty.c >lint_cppmac.h
diff lint_cmac.h lint_cppmac.h
Also, note that the list of directories to search for Standard Library
headers has some new additions when you use 'g++ -v -c empty.c' instead of
'gcc -v -c empty.c'. Your sequence of --i options should be set
accordingly.
That's about it for the preprocessor.
--- Size options ---
Finally, you'll need to establish sizes of primitive types. E.g. for a
64-bit platform this includes setting '-sp8' (indicating that pointers are
8 bytes wide). It often also involves setting '-sl8' (indicating that
'long' is eight bytes wide). As suggested earlier, the makefile
co-gcc.mak can generate these options for you.
If you find this tutorial to be lacking in some way, please contact us
(support@gimpel.com) with your suggestions for improvement.

View File

@ -0,0 +1,254 @@
#define __DBL_MIN_EXP__ (-1021)
#define __UINT_LEAST16_MAX__ 0xffff
#define __ATOMIC_ACQUIRE 2
#define __FLT_MIN__ 1.17549435082228750797e-38F
#define __GCC_IEC_559_COMPLEX 2
#define __UINT_LEAST8_TYPE__ unsigned char
#define __SIZEOF_FLOAT80__ 16
#define __INTMAX_C(c) c ## L
#define __CHAR_BIT__ 8
#define __UINT8_MAX__ 0xff
#define __WINT_MAX__ 0xffffffffU
#define __ORDER_LITTLE_ENDIAN__ 1234
#define __SIZE_MAX__ 0xffffffffffffffffUL
#define __WCHAR_MAX__ 0x7fffffff
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
#define __DBL_DENORM_MIN__ ((double)4.94065645841246544177e-324L)
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1
#define __GCC_ATOMIC_CHAR_LOCK_FREE 2
#define __GCC_IEC_559 2
#define __FLT_EVAL_METHOD__ 0
#define __unix__ 1
#define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 2
#define __x86_64 1
#define __UINT_FAST64_MAX__ 0xffffffffffffffffUL
#define __SIG_ATOMIC_TYPE__ int
#define __DBL_MIN_10_EXP__ (-307)
#define __FINITE_MATH_ONLY__ 0
#define __GNUC_PATCHLEVEL__ 0
#define __UINT_FAST8_MAX__ 0xff
#define __has_include(STR) __has_include__(STR)
#define __DEC64_MAX_EXP__ 385
#define __INT8_C(c) c
#define __UINT_LEAST64_MAX__ 0xffffffffffffffffUL
#define __SHRT_MAX__ 0x7fff
#define __LDBL_MAX__ 1.18973149535723176502e+4932L
#define __UINT_LEAST8_MAX__ 0xff
#define __GCC_ATOMIC_BOOL_LOCK_FREE 2
#define __UINTMAX_TYPE__ long unsigned int
#define __linux 1
#define __DEC32_EPSILON__ 1E-6DF
#define __unix 1
#define __UINT32_MAX__ 0xffffffffU
#define __LDBL_MAX_EXP__ 16384
#define __WINT_MIN__ 0U
#define __linux__ 1
#define __SCHAR_MAX__ 0x7f
#define __WCHAR_MIN__ (-__WCHAR_MAX__ - 1)
#define __INT64_C(c) c ## L
#define __DBL_DIG__ 15
#define __GCC_ATOMIC_POINTER_LOCK_FREE 2
#define __SIZEOF_INT__ 4
#define __SIZEOF_POINTER__ 8
#define __USER_LABEL_PREFIX__
#define __STDC_HOSTED__ 1
#define __LDBL_HAS_INFINITY__ 1
#define __FLT_EPSILON__ 1.19209289550781250000e-7F
#define __LDBL_MIN__ 3.36210314311209350626e-4932L
#define __STDC_UTF_16__ 1
#define __DEC32_MAX__ 9.999999E96DF
#define __INT32_MAX__ 0x7fffffff
#define __SIZEOF_LONG__ 8
#define __STDC_IEC_559__ 1
#define __STDC_ISO_10646__ 201605L
#define __UINT16_C(c) c
#define __DECIMAL_DIG__ 21
#define __gnu_linux__ 1
#define __has_include_next(STR) __has_include_next__(STR)
#define __LDBL_HAS_QUIET_NAN__ 1
#define __GNUC__ 6
#define __pie__ 2
#define __MMX__ 1
#define __FLT_HAS_DENORM__ 1
#define __SIZEOF_LONG_DOUBLE__ 16
#define __BIGGEST_ALIGNMENT__ 16
#define __DBL_MAX__ ((double)1.79769313486231570815e+308L)
#define __INT_FAST32_MAX__ 0x7fffffffffffffffL
#define __DBL_HAS_INFINITY__ 1
#define __DEC32_MIN_EXP__ (-94)
#define __INT_FAST16_TYPE__ long int
#define __LDBL_HAS_DENORM__ 1
#define __DEC128_MAX__ 9.999999999999999999999999999999999E6144DL
#define __INT_LEAST32_MAX__ 0x7fffffff
#define __DEC32_MIN__ 1E-95DF
#define __DBL_MAX_EXP__ 1024
#define __DEC128_EPSILON__ 1E-33DL
#define __SSE2_MATH__ 1
#define __ATOMIC_HLE_RELEASE 131072
#define __PTRDIFF_MAX__ 0x7fffffffffffffffL
#define __amd64 1
#define __STDC_NO_THREADS__ 1
#define __ATOMIC_HLE_ACQUIRE 65536
#define __LONG_LONG_MAX__ 0x7fffffffffffffffLL
#define __SIZEOF_SIZE_T__ 8
#define __SIZEOF_WINT_T__ 4
#define __GCC_HAVE_DWARF2_CFI_ASM 1
#define __GXX_ABI_VERSION 1010
#define __FLT_MIN_EXP__ (-125)
#define __INT_FAST64_TYPE__ long int
#define __DBL_MIN__ ((double)2.22507385850720138309e-308L)
#define __PIE__ 2
#define __LP64__ 1
#define __DECIMAL_BID_FORMAT__ 1
#define __DEC128_MIN__ 1E-6143DL
#define __REGISTER_PREFIX__
#define __UINT16_MAX__ 0xffff
#define __DBL_HAS_DENORM__ 1
#define __UINT8_TYPE__ unsigned char
#define __NO_INLINE__ 1
#define __FLT_MANT_DIG__ 24
#define __VERSION__ "6.3.0 20170516"
#define __UINT64_C(c) c ## UL
#define _STDC_PREDEF_H 1
#define __GCC_ATOMIC_INT_LOCK_FREE 2
#define __FLOAT_WORD_ORDER__ __ORDER_LITTLE_ENDIAN__
#define __STDC_IEC_559_COMPLEX__ 1
#define __INT32_C(c) c
#define __DEC64_EPSILON__ 1E-15DD
#define __ORDER_PDP_ENDIAN__ 3412
#define __DEC128_MIN_EXP__ (-6142)
#define __INT_FAST32_TYPE__ long int
#define __UINT_LEAST16_TYPE__ short unsigned int
#define unix 1
#define __INT16_MAX__ 0x7fff
#define __SIZE_TYPE__ long unsigned int
#define __UINT64_MAX__ 0xffffffffffffffffUL
#define __INT8_TYPE__ signed char
#define __ELF__ 1
#define __GCC_ASM_FLAG_OUTPUTS__ 1
#define __FLT_RADIX__ 2
#define __INT_LEAST16_TYPE__ short int
#define __LDBL_EPSILON__ 1.08420217248550443401e-19L
#define __UINTMAX_C(c) c ## UL
#define __SSE_MATH__ 1
#define __k8 1
#define __SIG_ATOMIC_MAX__ 0x7fffffff
#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2
#define __SIZEOF_PTRDIFF_T__ 8
#define __x86_64__ 1
#define __DEC32_SUBNORMAL_MIN__ 0.000001E-95DF
#define __INT_FAST16_MAX__ 0x7fffffffffffffffL
#define __UINT_FAST32_MAX__ 0xffffffffffffffffUL
#define __UINT_LEAST64_TYPE__ long unsigned int
#define __FLT_HAS_QUIET_NAN__ 1
#define __FLT_MAX_10_EXP__ 38
#define __LONG_MAX__ 0x7fffffffffffffffL
#define __DEC128_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143DL
#define __FLT_HAS_INFINITY__ 1
#define __UINT_FAST16_TYPE__ long unsigned int
#define __DEC64_MAX__ 9.999999999999999E384DD
#define __CHAR16_TYPE__ short unsigned int
#define __PRAGMA_REDEFINE_EXTNAME 1
#define __SEG_FS 1
#define __INT_LEAST16_MAX__ 0x7fff
#define __DEC64_MANT_DIG__ 16
#define __INT64_MAX__ 0x7fffffffffffffffL
#define __UINT_LEAST32_MAX__ 0xffffffffU
#define __SEG_GS 1
#define __GCC_ATOMIC_LONG_LOCK_FREE 2
#define __INT_LEAST64_TYPE__ long int
#define __INT16_TYPE__ short int
#define __INT_LEAST8_TYPE__ signed char
#define __STDC_VERSION__ 201112L
#define __DEC32_MAX_EXP__ 97
#define __INT_FAST8_MAX__ 0x7f
#define __INTPTR_MAX__ 0x7fffffffffffffffL
#define linux 1
#define __SSE2__ 1
#define __LDBL_MANT_DIG__ 64
#define __DBL_HAS_QUIET_NAN__ 1
#define __SIG_ATOMIC_MIN__ (-__SIG_ATOMIC_MAX__ - 1)
#define __code_model_small__ 1
#define __k8__ 1
#define __INTPTR_TYPE__ long int
#define __UINT16_TYPE__ short unsigned int
#define __WCHAR_TYPE__ int
#define __SIZEOF_FLOAT__ 4
#define __pic__ 2
#define __UINTPTR_MAX__ 0xffffffffffffffffUL
#define __DEC64_MIN_EXP__ (-382)
#define __INT_FAST64_MAX__ 0x7fffffffffffffffL
#define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1
#define __FLT_DIG__ 6
#define __UINT_FAST64_TYPE__ long unsigned int
#define __INT_MAX__ 0x7fffffff
#define __amd64__ 1
#define __INT64_TYPE__ long int
#define __FLT_MAX_EXP__ 128
#define __ORDER_BIG_ENDIAN__ 4321
#define __DBL_MANT_DIG__ 53
#define __SIZEOF_FLOAT128__ 16
#define __INT_LEAST64_MAX__ 0x7fffffffffffffffL
#define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 2
#define __DEC64_MIN__ 1E-383DD
#define __WINT_TYPE__ unsigned int
#define __UINT_LEAST32_TYPE__ unsigned int
#define __SIZEOF_SHORT__ 2
#define __SSE__ 1
#define __LDBL_MIN_EXP__ (-16381)
#define __INT_LEAST8_MAX__ 0x7f
#define __SIZEOF_INT128__ 16
#define __LDBL_MAX_10_EXP__ 4932
#define __ATOMIC_RELAXED 0
#define __DBL_EPSILON__ ((double)2.22044604925031308085e-16L)
#define _LP64 1
#define __UINT8_C(c) c
#define __INT_LEAST32_TYPE__ int
#define __SIZEOF_WCHAR_T__ 4
#define __UINT64_TYPE__ long unsigned int
#define __INT_FAST8_TYPE__ signed char
#define __GNUC_STDC_INLINE__ 1
#define __DBL_DECIMAL_DIG__ 17
#define __STDC_UTF_32__ 1
#define __FXSR__ 1
#define __DEC_EVAL_METHOD__ 2
#define __UINT32_C(c) c ## U
#define __INTMAX_MAX__ 0x7fffffffffffffffL
#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
#define __FLT_DENORM_MIN__ 1.40129846432481707092e-45F
#define __INT8_MAX__ 0x7f
#define __PIC__ 2
#define __UINT_FAST32_TYPE__ long unsigned int
#define __CHAR32_TYPE__ unsigned int
#define __FLT_MAX__ 3.40282346638528859812e+38F
#define __INT32_TYPE__ int
#define __SIZEOF_DOUBLE__ 8
#define __FLT_MIN_10_EXP__ (-37)
#define __INTMAX_TYPE__ long int
#define __DEC128_MAX_EXP__ 6145
#define __ATOMIC_CONSUME 1
#define __GNUC_MINOR__ 3
#define __UINTMAX_MAX__ 0xffffffffffffffffUL
#define __DEC32_MANT_DIG__ 7
#define __DBL_MAX_10_EXP__ 308
#define __LDBL_DENORM_MIN__ 3.64519953188247460253e-4951L
#define __INT16_C(c) c
#define __STDC__ 1
#define __PTRDIFF_TYPE__ long int
#define __ATOMIC_SEQ_CST 5
#define __UINT32_TYPE__ unsigned int
#define __UINTPTR_TYPE__ long unsigned int
#define __DEC64_SUBNORMAL_MIN__ 0.000000000000001E-383DD
#define __DEC128_MANT_DIG__ 34
#define __LDBL_MIN_10_EXP__ (-4931)
#define __SIZEOF_LONG_LONG__ 8
#define __GCC_ATOMIC_LLONG_LOCK_FREE 2
#define __LDBL_DIG__ 18
#define __FLT_DECIMAL_DIG__ 9
#define __UINT_FAST16_MAX__ 0xffffffffffffffffUL
#define __GCC_ATOMIC_SHORT_LOCK_FREE 2
#define __UINT_FAST8_TYPE__ unsigned char
#define __ATOMIC_ACQ_REL 4
#define __ATOMIC_RELEASE 3

View File

@ -0,0 +1,85 @@
# This file contains functions and configurations for generating PC-Lint build
# targets for your CMake projects.
set(PC_LINT_EXECUTABLE "lint-nt.exe" CACHE STRING "full path to the pc-lint executable. NOT the generated lin.bat")
set(PC_LINT_CONFIG_DIR "${PROJECT_SOURCE_DIR}/lint/gnu" CACHE STRING "full path to the directory containing pc-lint configuration files")
set(PC_LINT_USER_FLAGS "-b" CACHE STRING "additional pc-lint command line options -- some flags of pc-lint cannot be set in option files (most notably -b)")
# a phony target which causes all available *_LINT targets to be executed
add_custom_target(ALL_LINT)
# add_pc_lint(target source1 [source2 ...])
#
# Takes a list of source files and generates a build target which can be used
# for linting all files
#
# The generated lint commands assume that a top-level config file named
# 'std.lnt' resides in the configuration directory 'PC_LINT_CONFIG_DIR'. This
# config file must include all other config files. This is standard lint
# behaviour.
#
# Parameters:
# - target: the name of the target to which the sources belong. You will get a
# new build target named ${target}_LINT
# - source1 ... : a list of source files to be linted. Just pass the same list
# as you passed for add_executable or add_library. Everything except
# C and CPP files (*.c, *.cpp, *.cxx) will be filtered out.
#
# Example:
# If you have a CMakeLists.txt which generates an executable like this:
#
# set(MAIN_SOURCES main.c foo.c bar.c)
# add_executable(main ${MAIN_SOURCES})
#
# include this file
#
# include(/path/to/pc_lint.cmake)
#
# and add a line to generate the main_LINT target
#
# if(COMMAND add_pc_lint)
# add_pc_lint(main ${MAIN_SOURCES})
# endif(COMMAND add_pc_lint)
#
function(add_pc_lint target)
get_directory_property(lint_include_directories INCLUDE_DIRECTORIES)
get_directory_property(lint_defines COMPILE_DEFINITIONS)
# let's get those elephants across the alps
# prepend each include directory with "-i"; also quotes the directory
set(lint_include_directories_transformed)
foreach(include_dir ${lint_include_directories})
list(APPEND lint_include_directories_transformed -i"${include_dir}")
endforeach(include_dir)
# prepend each definition with "-d"
set(lint_defines_transformed)
foreach(definition ${lint_defines})
list(APPEND lint_defines_transformed -d${definition})
endforeach(definition)
# list of all commands, one for each given source file
set(pc_lint_commands)
foreach(sourcefile ${ARGN})
# only include c and cpp files
if( sourcefile MATCHES \\.c$|\\.cxx$|\\.cpp$ )
# make filename absolute
get_filename_component(sourcefile_abs ${sourcefile} ABSOLUTE)
# create command line for linting one source file and add it to the list of commands
list(APPEND pc_lint_commands
COMMAND ${PC_LINT_EXECUTABLE}
-i"${PC_LINT_CONFIG_DIR}" std.lnt
"-u" ${PC_LINT_USER_FLAGS}
${lint_include_directories_transformed}
${lint_defines_transformed}
${sourcefile_abs})
endif()
endforeach(sourcefile)
# add a custom target consisting of all the commands generated above
add_custom_target(${target}_LINT ${pc_lint_commands} VERBATIM)
# make the ALL_LINT target depend on each and every *_LINT target
add_dependencies(ALL_LINT ${target}_LINT)
endfunction(add_pc_lint)

View File

@ -0,0 +1 @@

View File

@ -0,0 +1 @@
co-gcc.lnt

View File

@ -0,0 +1,42 @@
// ---------------------------------------------------------------------
// This file is provided by Gimpel Software (www.gimpel.com) for use with
// its products PC-lint and FlexeLint.
//
// Redistribution and use of this file, with or without modification, is
// permitted provided that any such redistribution retains this notice.
// ---------------------------------------------------------------------
#ifndef LINT_SUPPORT_CO_MSC100_H_
#define LINT_SUPPORT_CO_MSC100_H_
// co-msc100.h --
// This header is automatically included in every module if you use
// co-msc100.lnt. (There is a -header(co-msc100.h) option therein
// for this purpose.)
// Microsoft's C++11 implementation does not yet include built-in support
// for the new character types, so we need to disable the relevant
// keywords here. (This must be done before the inclusion of any other
// header file because Microsoft's library headers contain declarations of
// typedef names with the same spelling.)
//lint -rw(char16_t,char32_t)
// Next we must compensate for the fact that class typeinfo is available
// for use in the MSC compilers without an explicit definition. According
// to the standard this class definition is not (available by default).
#ifdef __cplusplus
#include <typeinfo>
#else // C mode
// co-msc100.lnt defines some macros that the Microsoft compiler defines
// in C++ modes but not in C mode; we must un-define them here:
#undef _CPPRTTI
#undef _NATIVE_WCHAR_T_DEFINED
#undef _WCHAR_T_DEFINED
#undef _NATIVE_NULLPTR_SUPPORTED
#endif
#endif /* LINT_SUPPORT_CO_MSC100_H_ */

View File

@ -0,0 +1,461 @@
/* Date Stamp */ -d"_lint_co_msc100_lnt=co-msc100.lnt modified 19-Sep-2013"
/* To document usage use: -message( "Using " _lint_co_msc100_lnt ) */
// ---------------------------------------------------------------------
// This file is provided by Gimpel Software (www.gimpel.com) for use with
// its products PC-lint and FlexeLint.
//
// Redistribution and use of this file, with or without modification, is
// permitted provided that any such redistribution retains this notice.
// ---------------------------------------------------------------------
// co-msc100.lnt
// Compiler Options for Visual Studio for C/C++ Version 10.00
// (Visual Studio 2010)
// This file contains options to allow PC-lint to process source
// files for your compiler. It is used as follows:
//
// lint co-msc100.lnt source-file(s)
//
// (See macros-msc.c and/or macros-msc.cpp for details.)
// Section 1: options independent of the use of the automatic macro
// generator (macros-msc.cpp)
//
-cmsc
-A(C++2011)
+compiler(search_actively_including_stack)
-si4 // integers are 4 bytes
-sp4 // pointers are 4 bytes too.
// We now support __declspec directly so that the following
// option is now commented out. If trouble ensues you can
// once again disable __declspec through this option.
// -d__declspec()= // ignore this construct
-d_declspec=__declspec // the single '_' version is occasionally used
// while processing compiler (library) header files ...
-wlib(1) // sets the warning level within library headers to 1
// (no warnings, just syntax errors). Comment out if you
// are actually linting library headers. This
// option makes obsolete options of the form -elib(axxx) where
// xxx >= 400 which may be retained for historical reasons.
-elib(1111) // Some VC++ headers contain explicit specializations at class
// scope.
-elib(19) // useless declarations (lone semicolons)
-elib(123) // function-like macro name used as non macro
-elib(652) // suppress message about #define of earlier declared symbols
-elib(762) // suppress message about multiple identical declarations and
-elib(760) // suppress message about multiple identical macro defs
-elib(514) // allow #if <boolean> | <boolean>
-elib(553) // undefined preprocessor variables assumed 0
-elib(1081) // suspicious object argument to an object parameter
-elib(726) // extraneous comma in enum definition
-elib(157) // suppress message about no data may follow an incomplete array
-elib(91) // suppress message about line exceeds 598 characters
// SREGS, WORDREGS, BYTEREGS are defined in both bios.h and dos.h
// and accordingly you MAY get type differences based on 'origin'.
// If so, use the following options:
// -etd(origin)
// -elib(770)
-format=%(%f(%l)\s:\s%)%t\s%n:\s%m
// error format similar to MSC
// Note that %c can also be used to specify column
-e46 // allows bit-fields to be other than int or unsigned
+fan // allow anonymous unions
+fdi // Use directory of the including file
+fbo // enable the bool type
+fwm // wprintf format codes are not standard
-fdh // do not append a .h to header names
-esym(123,min,max) // allows users to use min, max as variables
+rw(__inline) // activate the __inline keyword
-rw_asgn(__nullptr,nullptr)
-e19 // Suppress errors about lone semicolons
+ppw(import) // activate #import
-d_inline=__inline // _inline is the same as __inline
-sld8 // sizeof(long double) is 8.
-function(exit,_exit) // _exit() is like exit()
-function(exit,_assert) // _assert() is like exit()
-emacro(506,assert) // don't warn about constant value Boolean
-emacro(734,putc) // don't complain about items being too large.
-emacro(415,_FP_SEG) // access of out-of-bounds pointer
-emacro(740,FP_SEG,FP_OFF) // unusual casts
-emacro((???),va_arg) // the va_arg() macro can yield 415, 416, 661, 662
// 796 and 797 (out-of-bounds errors).
-emacro((???),va_start) // the same applies to va_start
-emacro(413,offsetof) // use of NULL pointer creates a stir
-emacro(545,offsetof) // addressing an array member is OK
-emacro(845,RGB) // a common use of RGB uses a operator that produces a 0
-e793 // inhibit 'ANSI limit reached' --
// limits are impractically low with MSVC headers
-esym(628,eof) // failure to provide argument information for eof()
-esym(773,L_tmpnam) // defined with an unparenthesized '+'
-esym(438,_acp) // USES_CONVERSION assigns to _acp.
-emacro(571,__isascii) // don't warn about the unusual cast
-emacro(522,UNREFERENCED_PARAMETER) // don't complain about a lack of
// side-effects
-emacro(648,CDN_*) // ignore unsigned overflow
-emacro(648,OIVN_*) // ignore unsigned overflow
-emacro(648,TTN_*) // ignore unsigned overflow
-emacro(648,TVN_*) // ignore unsigned overflow
-emacro(648,TBN_*) // ignore unsigned overflow
// The following functions exhibit variable return modes.
// That is, they may equally-usefully be called for a value
// as called just for their effects. Accordingly we inhibit
// Warning 534 for these functions.
// Feel free to add to or subtract from this list.
-esym(534,close,creat,fclose,fflush,_flsbuf,fprintf,fputc)
-esym(534,fputs,fscanf,fseek,fwrite,lseek,memcpy,memmove,memset)
-esym(534,printf,puts,scanf,sprintf,sscanf,strcat,strcpy)
-esym(534,strncat,strncpy,unlink,write)
// These are the wide char variants of printf-scanf family
-wprintf( 1, wprintf )
-wprintf( 3, fwprintf, swprintf )
-wscanf( 1, wscanf )
-wscanf( 2, fwscanf, swscanf )
// These are substitutions for sprintf
-printf( 3, StringCbPrintfA )
-printf( 3, StringCchPrintfA )
-wprintf( 3, StringCbPrintfW )
-wprintf( 3, StringCchPrintfW )
// The following options are used to adjust our function mimicry to
// the actual library as provided by MS.
-function( wcstombs(1) ) // remove the check for a NULL first arg to wcstombs()
// The following options are required by most compilers to
// noiselessly process iostream.h
-elib(1717) // empty prototypes
-elib(522) // function return value ignored
-elib(1053) // prototypes cannot be distinguished
-elib(1721) // unusual operator =() declaration
-elib(1720) // assignment op has non-const parameter
-elib(655) // bitwise operator combining compatible enum's
-elib(641) // converting enum's to int
-elib(537) // repeated include file (ios.h)
-elib(1511) // member (rdbuf) hides nonvirtual member
-elib(1712) // default constructor not defined for class
-elib(1736) // redundant access specifier
-esym(1702,operator<<,operator>>) // both a member and an ordinary function
// These functions return things that are frequently ignored.
-esym(534,*operator<<,*operator>>)
// The following additional options seem to be needed.
-elib(506) // constant value Boolean
-elib(620) // el or one? (some constants end in 'l' not 'L')
-elib(648) // overflow in computing constant (3<<16)
-elib(659) // nothing fold_NATIVE_WCHAR_T_DEFINEDlows '}' on some line
-elib(723) // suspicious use of '='
-elib(747) // significant prototype coercion
-elib(740) // unusual pointer casts
-elib(1007) // virtual functions within extern "C" block
-elib(1029) // default argument repeated -- can't dist. char, signed char
-elib(1055) // call to rdbuf() questioned?
-elib(1504) // apparently useless structs
-elib(1708,1709) // minor C/C++ declaration conflict
-elib(1707) // operator new declared w/o 'static'
-elib(1722) // assignment op does not return reference
-elib(149) // default argument found in C code.
-elib(578) // declaration of time hides delaration of global time().
-elib(761) // two equivalent typedef declarations
-elib(1065) // same name declared as "C" and not "C"
-elib(1066) // same name declared as "C" and not "C"
-elib(1704) // constructor with private access declaration
-elib(1735) // default parameter within virtual function
-elib(773) // macros that look like unparenthesized expressions
-elib(806) // 1-bit bitfields typed int
-elib(1501) // 0-length data members
-elib(1510) // base class has no destructor
-elib(1516) // data member hides inherited member
-elib(1509) // base class destructor is not virtual
// Special Notice: You may be receiving mysterious 1058 errors
// when you use "iomanipulator"s. For example:
// cout << setw(4) << 4;
// results in Error 1058 (assigning a const to a ref) because the
// manipulator setw returns a non-lvalue which is assigned to a reference.
// This reflects an oversight in the Microsoft header file: iomanip.h
// Therein you may change the declaration:
// friend ostream& operator<<(iostream& s, IOMANIP(T) & sm) { ...
// to:
// friend ostream& operator<<(iostream& s, const IOMANIP(T) & sm) { ...
// to reflect the fact that sm is not modified by this function.
+fll // enable long long
// In the following option we define __uuidof() and suppress
// Errors 50 and 69 and 1924 in exprs. containing same
-d"__uuidof()= /*lint --e(50,69,1924) */ (_GUID)0"
-esym(123,FD_SET) // defined as macro and as typedef
-esym(1726,endl,ends) // taking the address of an overloaded function
-esym(18,Data_t::Data_t) // definition not matching declaration
-elib(10) // expecting ')' -- comdef.h has a: #if defined( id
-elib(43) // vacuous array within _MIDL_FORMAT_STRING
-elib(602) // benign comment within comment
-elib(657) // declaring "anonymous struct" in union _LARGE_INTEGER
-elib(799) // long numerical constant for max. __int64
-elib(1502) // nothrow has no data members
-elib(1505) // no access specifier in base class specifier
-elib(1515) // AFX_THREAD_STATE member has no default constructor
-elib(1706) // Unusual declaration with a scope operator
-elib(1725) // data member is a reference
-elib(1548) // conflicting exception specifications
-elib(1737) // hiding global operator new
-elib(1739) // binary operator should be non-member function
-elib(1748) // non-virtual base class included twice
-elib(1759) // post-fix operator returns a reference
// Add elements of ole automation
lib-ole.lnt
// Options required for .net
-d_stdcall=__stdcall // make _stdcall equivalent to __stdcall
-d__interface=class // treat an interface the same as a class
-d__unaligned= // pass over the __unaligned keyword
-d__w64= // ignore this identifier
-esym(40,DLGPROC) // used before being defined
-elib(146) // assuming binary constant
-elib(1015) // GetDefaultThreads not found in class
+ppw(using) // ignore #using for now.
-d__pragma(x)= // ignore the pragma extension
+rw(__ptr64) // additional qualifier
+rw_asgn(__thiscall,fortran) // additional qualifier
-"d__identifier(x)=___identifier x"
// treat C++ keyword x as an identifier
-elibsym(1512) // base class destructor not virtual
-d__TIMESTAMP__="Mon Jan 01 00:00:00 2010"
-d__COUNTER__=__lint__COUNTER__
-d__FUNCDNAME__="MyFunc"
-d__FUNCSIG__="MyFunc"
-d__FUNCTION__=___function___
-dinitonly= // Compiler should catch miss-uses.
// Lint can just skip over it.
-"dliteral=static const" // Documentation says they are
// equivalent for member data.
// __try_cast is like dynamic_cast (except the former throws where
// the latter returns 0).
-d__try_cast=dynamic_cast
+rw(__restrict) // reserved word
// Partial support for the "old" (VC++ 2003) Managed Extensions
// syntax:
+rw( __gc, __value, __nogc, __pin, __ptr32, __ptr64 )
-$ // $ can be used in identifiers
+rw( __allowed_on_parameter )
+rw( __allowed_on_function )
+rw( __allowed_on_typedecl )
+rw( __allowed_on_return )
+rw( __allowed_on_struct )
+rw( __allowed_on_function_or_typedecl )
+rw( __allowed_on_field )
+rw( __allowed_on_parameter_or_return )
+rw( __allowed_on_function )
+rw( *type_traits ) //type traits support
+e1942 // This Elective Note alerts the user to the non-standard
// way in which MS handles originally-dependent base classes.
// E.g. template<class T> class A : T { ... x ... };
// Should T be searched for "x" during instantiation?
// the standard says "no", MS does.
-header(co-msc100.h) // implicitly includes <typeinfo>. (Needed because
// MSVC 9 implicitly declares class type_info.)
// Section 2: options that should be commented out if you use the
// automatic macro generator (macros-msc.cpp)
// Note, a macro option of the form:
// -dA{1}
// has the same effect as:
// -dA=1
// or:
// -d"A=1"
// The curly-brace version of the syntax is appropriate for
// macro-scavenging (the method we used to generate the macro options
// below). For details, see notes on the -scavenge() option in section
// 5.8.3 in the Lint manual. See also the macro generator file,
// macros-msc.cpp, which follows the form of -scavenge() output.
// We generated the options in this section with the following commands:
// %VSInstallDir%\vc\bin\vcvars32.bat
// cl /EP /C macros-msc.cpp
// The options for other build configurations will probably differ (which
// is why you should comment out the following if you use the macro
// generator).
// Also note: some of the following are defined for C++ mode but not for C
// mode; but there's no need to comment them out here because they are
// conditionally #undef'd in co-msc100.h.
-d_CPPRTTI{1}
//
// Defined for code compiled with /GR (Enable Run-Time Type
// Information).
//
-d_INTEGRAL_MAX_BITS{64}
//
// Reports the maximum size (in bits) for an integral type.
//
// NOTE:
// When generating 64-bit code, the definition for _M_IX86 must be
// commented out.
-d_M_IX86{600}
//
// Defined for x86 processors. See the "Values for _M_IX86 table" (in
// Microsoft's preprocessor documentation) for more information. This
// is not defined for x64 processors.
//
-d_M_IX86_FP{0}
//
// Expands to a value indicating which /arch compiler option was used:
//
// 0 if /arch was not used.
//
// 1 if /arch:SSE was used.
//
// 2 if /arch:SSE2 was used.
//
// See /arch (Minimum CPU Architecture) for more information.
//
-d_MSC_BUILD{1}
//
// Evaluates to the revision number component of the compiler's
// version number. The revision number is the fourth component of the
// period-delimited version number. For example, if the version number
// of the Visual C++ compiler is 15.00.20706.01, the _MSC_BUILD macro
// evaluates to 1.
//
-d_MSC_EXTENSIONS{1}
//
// This macro is defined when you compile with the /Ze compiler option
// (the default). Its value, when defined, is 1.
//
-d_MSC_FULL_VER{160030319}
//
// Evaluates to the major, minor, and build number components of the
// compiler's version number. The major number is the first component
// of the period-delimited version number, the minor number is the
// second component, and the build number is the third component. For
// example, if the version number of the Visual C++ compiler is
// 15.00.20706.01, the _MSC_FULL_VER macro evaluates to 150020706.
// Type cl /? at the command line to view the compiler's version
// number.
//
-d_MSC_VER{1600}
//
// Evaluates to the major and minor number components of the
// compiler's version number. The major number is the first component
// of the period-delimited version number and the minor number is the
// second component.
//
// For example, if the version number of the Visual C++ compiler is
// 15.00.20706.01, the _MSC_VER macro evaluates to 1500.
//
// In Visual Studio 2010, _MSC_VER is defined as 1600.
//
-d_MT{1}
//
// Defined when /MD or /MDd (Multithreaded DLL) or /MT or /MTd
// (Multithreaded) is specified.
//
-d_NATIVE_WCHAR_T_DEFINED{1}
//
// Defined when /Zc:wchar_t is used.
//
-d_WCHAR_T_DEFINED{1}
//
// Defined when /Zc:wchar_t is used or if wchar_t is defined in a
// system header file included in your project.
//
-d_WIN32{1}
//
// Defined for applications for Win32 and Win64. Always defined.
//
/**** Undocumented predefined macros follow ****/
-d_NATIVE_NULLPTR_SUPPORTED{1}
// Section 3: options that should remain commented out if you use the
// automatic macro generator (macros-msc.cpp)
// When compiling with /J, use:
//+fcu // Plain char is unsigned
//-d_CHAR_UNSIGNED
// When compiling with /clr, /clr:pure or /clr:safe, use:
//-d__cplusplus_cli=200406 // for all 3
//-d_M_CEE_PURE // for /clr:pure
//-d_M_CEE_SAFE // for /clr:safe
//-d_MANAGED // for /clr
// When using any /clr form, use:
//-d_M_CEE
// When compiling with /GX or /EH, use:
//-d_CPPUNWIND // Enable Exception Handling
// When compiling for Win64, use:
//-d_WIN64
// When compiling with /Wp64, use:
//-d_Wp64 // 64-bit portability
// Be sure to define your platform if any of the following apply:
//-d_M_ALPHA // For DEC ALPHA platforms
//-d_M_IA64 // For Itanium 64-bit processors
//-d_M_X64 // For x64 processors
// When compiling with the /RTC option, use:
//-d__MSVC_RUNTIME_CHECKS // Using such checks
// When compiling with /openmp, use:
//-d_OPENMP=200203 // OpenMP specification date
// When compiling with /Zl, use:
//-d_VC_NODEFAULTLIB // Omit default library name in *.obj file
/* DLL's or Multithreads? Enable the following:
-d_AFXDLL // making a DLL
-d_DLL // ditto
*/

View File

@ -0,0 +1,221 @@
/* Date Stamp */ -d"_lint_env_vc10_lnt=env-vc10.lnt modified 22-Feb-2012"
/* To document usage use: -message( "Using " _lint_env_vc10_lnt ) */
// ---------------------------------------------------------------------
// This file is provided by Gimpel Software (www.gimpel.com) for use with
// its products PC-lint and FlexeLint.
//
// Redistribution and use of this file, with or without modification, is
// permitted provided that any such redistribution retains this notice.
// ---------------------------------------------------------------------
/*
env-vc10.lnt: environment parameters for Microsoft's Visual C++ 10.0
If you are using Microsoft Visual Studio 2010 and you wish to invoke
PC-lint from that environment then add one or more commands to the
Tools menu as follows.
Simple Check
------------
For example, to add a simple facility to lint the current file you
may do the following:
1. From the Tools Menu choose "External Tools ..."
2. Click the "Add" button.
3. You will now be able to enter the fields of this Tool.
Modify them so that they approximate the following:
Title: PC-lint (Simple Check)
Command: c:\lint\lint-nt.exe
Arguments:
-i"c:\lint" std.lnt env-vc10.lnt "$(ItemFileName)$(ItemExt)"
Initial Directory: $(ItemDir)
X_Use Output Window __Prompt for arguments __Close on exit
Please note that you will have to change the "Command:" path if
the PC-lint Installation Directory is anything other than c:\lint
and you will have to change the "Arguments:" line if the
Configuration Directory is anything other than c:\lint
4. Select OK to return to the main environment.
This will result in the Tools menu containing the additional item
"PC-lint (Simple Check)". Checking 'X' on 'Use Output Window' is
important because in this way you can advance from error to error
using the F8 key (Shift F8 to reverse).
Strings of the form $(...) are called macros and can be typed in
directly as shown or can be selected from a menu by clicking
a right arrow in the dialog box. $(ItemFileName) refers to the
file name of the currently edited file without its path and without
its extension. $(ItemExt) is its extension. $(ItemDir) represents
the file's directory.
You will probably want to advance your new tool upward into the
initial position of all tools while you are testing and modifying the
command. You can do this by using the "Move Up" button that appears
on the External Tools dialog.
The benefits of using "Initial Directory" are that file-names in lint
error messages will not be so long, and, also, this directory can
contain a std.lnt that overrides the global std.lnt in the
Configuration Directory.
This Simple Check is fine to check stand-alone modules but to check
projects or to unit check modules that are in projects we need to
go a bit further ...
Project Creation
----------------
To lint an entire project we will need the names of all the modules
in the project. Visual Studio keeps these names (as well as some
appropriate options such as define options (-d...) and include options
(-i...) in a file named NAME.vcproj in the current project directory.
NAME is the name of the project and is identified by the macro
$(TargetName). PC-lint can read the .vcproj file and generate the
appropriate .lnt file. We recommend creating a tool for this purpose.
For this tool follow the steps 1-4 doing exactly the same thing as
above except in step 3, the information entered should be:
Title: PC-lint (Project Creation)
Command: c:\lint\lint-nt.exe
Arguments: -v -os("$(TargetName).lnt") "$(ProjectFileName)"
Init. Dir.: $(ProjectDir)
__Use Output Window __Prompt for arguments x_Close on exit
You will need to have an active project before this will work.
If you don't already have one you can obtain an active project
from the Solutions Explorer. You then click the newly added
"PC-lint (Project Creation)" tool on the tools menu to create
NAME.lnt.
The file created is an ASCII file and we recommend that you open it
within the IDE and examine it for any obvious flaws. This is your
chance to make any necessary modifications to the file as the process
of conversion may be less than perfect.
Project Check
-------------
Interestingly, by opening up the NAME.lnt file created above and
running the Simple Check described earlier you have the equivalent
of a full project check. However, we prefer to create a special
Project Check tool.
Now that we have a project file we can create a new tool called
"PC-lint (project check)". For this tool again follow steps 1-4 doing
exactly the same thing as above except in step 3, the information
entered should be:
Title: PC-lint (Project Check)
Command: c:\lint\lint-nt.exe
Arguments: -i"c:\lint" std.lnt env-vc10.lnt "$(TargetName).lnt"
Init. Dir.: $(ProjectDir)
X_Use Output Window __Prompt for arguments __Close on exit
Unit Check
----------
You can almost do a unit check on any single module by using the
Simple Check scheme suggested above. The only problems are that you
will need a -u option and you will not have the benefit of any -d or
-i options that have been placed into NAME.lnt created in the Project
Creation step. For this reason we suggest the following tool for
doing a unit check of any module that is part of a project and for
which a .lnt project file has been generated.
Title: PC-lint (Unit Check)
Command: c:\lint\lint-nt.exe
Arguments:
-i"c:\lint" std.lnt env-vc10.lnt --u "$(TargetName).lnt" "$(ItemPath)"
Init. Dir.: $(ProjectDir)
X_Use Output Window __Prompt for arguments __Close on exit
Note that $(ItemPath) will provide a complete path name and in the
absence of a project.lnt file it would cause full path names to
appear in messages. But a side effect of using the project file
with the --u option means that we adopt the shorter names used
in the project file.
Suppressing Messages
----------- --------
Suppressing messages is normally done by adding message suppression
options to a file. For example, -e550 will suppress message 550.
There are numerous other options to suppress messages.
As the documentation indicates, the file
c:\lint\options.lnt
(where c:\lint\ is the Configuration Directory) is the presumed
container of your overall suppression policy. (Note: options.lnt is
referenced by std.lnt). Add a message suppression here and you will
affect all linting employing that configuration.
To suppress messages for a particular project (or for all projects
within a given project directory) you may do the following:
Create a file std.lnt that is contained in the project directory.
Make it refer back to the std.lnt in the Configuration Directory.
Then add additional message suppression options or indeed any options
you want. For example it might contain:
c:\lint\std.lnt // reference to original std.lnt
-e550 // project-specific option
In this way suppression is limited to a particular project.
Tool Bar
--------
You also have the option of creating a PC-lint toolbar within your
Visual C++ IDE. First, create one or more tools as described above.
You will need to know the number(s) of the tool(s) you want to place
on the tool bar. This can only be done by the painful and laborious
task of counting. Using the list provided by "Tools"/"External
Tools", jot down the numbers (starting with 1 at the top) of all the
tools to be added to the tool bar. We recommend placing all the
PC-lint tools on a single tool bar. Then select Customize from the
Tools menu. Select the Toolbars tab and click the New... button.
Give the Toolbar a name (E.g., PC-lint) in the dialog box provided
and click "OK". Confirm that the new toolbar is now floating on
the desktop and that a check has been placed in the check box next
to the new toolbar name. Then click on the Commands tab and
select the "Toolbar:" radio button. Open the drop down list and
select "PC-Lint" from the choices. Click the "Add Command..."
button to reveal the "Add Command" window. In the "Categories:"
box scroll down to and select the "Tools" item. In the
"Commands:" box scroll down to and select the appropriate
"External Command" numbered item that corresponds to the desired
PC-Lint command, then click the OK button to add the selected item
to the PC-Lint toolbar. Repeat the "Add Command..." process for
each desired PC-Lint command the you wish to place on the PC-Lint
toolbar.
If you want to add a button image to the toolbar, you can choose one
via the Modify Selection button. Click Close and you now have your
own PC-lint for C/C++ button. (Note: If you change the location of
the PC-lint menu item on the Tools menu, you will change the subscript
and you will need to change the button(s) on the toolbar.)
*/
-"format=%(%F(%l):%) error %n: (%t -- %m)" // Messages will contain
// file information (%F), the line number (%l), the
// message number (%n), message type (%t) and message text (%m).
-hF2 // Make sure we ALWAYS provide file information ('F') and use 2
// lines (one for the source line in error and one for the
// message).
-width(0) // don't break messages at any particular width
-t4 // Presume that tabs are every 4 stops
//+e900 // issue a message at termination.

View File

@ -0,0 +1,17 @@
/* Date Stamp */ -d"_lint_lib_ole_lnt=lib-ole.lnt modified 23-Mar-2004"
/* To document usage use: -message( "Using " _lint_lib_ole_lnt ) */
// ---------------------------------------------------------------------
// This file is provided by Gimpel Software (www.gimpel.com) for use with
// its products PC-lint and FlexeLint.
//
// Redistribution and use of this file, with or without modification, is
// permitted provided that any such redistribution retains this notice.
// ---------------------------------------------------------------------
// BSTR functions (part of OLE Automation)
-sem( SysAllocString, @p == malloc(1p) || @p == 0, 1p )
-sem( SysAllocStringByteLen, @P == malloc(2n+1) || @p == 0 )
-sem( SysAllocStringLen, @p == malloc(2n+1) || @p == 0 )
-sem( SysStringLen, 1p ? @n == 1p - 1 : @n == 0 )
-function( free, SysFreeString )

View File

@ -0,0 +1,56 @@
/* Date Stamp */ -d"_lint_lib_w32_lnt=lib-w32.lnt modified 2-Mar-1999"
/* To document usage use: -message( "Using " _lint_lib_w32_lnt ) */
// ---------------------------------------------------------------------
// This file is provided by Gimpel Software (www.gimpel.com) for use with
// its products PC-lint and FlexeLint.
//
// Redistribution and use of this file, with or without modification, is
// permitted provided that any such redistribution retains this notice.
// ---------------------------------------------------------------------
// lib-w32.lnt
// PC-lint Library Options File for 32-bit mode windows.h
-d__FLAT__
-d_WIN32
-si4
-sp4
-esym(14,pLocalHeap) // variable defined in windows.h
-e740 // remove 'suspicious cast' messages because these must be
// routinely done within Windows.
-elib(46) // windows.h uses a BYTE as base of bit field.
-e793 // windows breaks ANSI limits
// the following functions have their return value typically ignored.
// add or subtract from this list as desired.
-esym(534,RegisterClass,ShowWindow,TranslateMessage,DispatchMessage)
-esym(534,DrawText,GetTextMetrics,ReleaseDC,TextOut,SetTextAlign)
-esym(534,SetScrollPos,SelectObject,SetBkMode,SendMessage,MessageBox)
-esym(534,MessageBoxA,MessageBoxW,PostMessageA,PostMessageW)
-esym(534,PatBlt,DeleteDC,SetCapture,SetCursor,StretchBlt)
-esym(534,Rectangle,MoveTo,LineTo,ShowCursor,MoveWindow,SetWindowWord)
-esym(534,SetPixel,FillRect,DeleteObject,KillTimer,GetProfileString)
-esym(534,SetWindowLong,SetFocus,SetBkColor,SetTextColor,SetBrushOrg)
-esym(534,UnrealizeObject,_lclose,Polygon,FrameRect,LoadString)
-esym(534,GetInstanceData,GlobalUnlock,FreeResource,LoadString)
-esym(534,DrawIcon,AppendMenu,GetObject,CheckMenuItem,SetClassWord)
-esym(534,EnableMenuItem,SetMenu,DestroyMenu,TrackPopupMenu)
-esym(534,AnsiUpper,Arc,BeginPaint,BitBlt,ChangeClipboardChain,Chord)
-esym(534,CloseClipboard,CombineRgn,DdeClientTransaction,DdeDisconnect)
-esym(534,DdeFreeStringHandle,DdeGetData,DdeNameService,DdePostAdvise)
-esym(534,DdeQueryString,DdeUninitialize,DeleteMenu,DeleteMetaFile)
-esym(534,DestroyWindow,DialogBox,DPtoLP,Ellipse,EmptyClipboard,EnableWindow)
-esym(534,EnumChildWindows,EnumWindows,Escape,GetClassName,GetDlgItemText)
-esym(534,GetFileTitle,GetMenuString,GetStrings,GetSystemMenu,GetTextFace)
-esym(534,GetWindowText,GlobalDeleteAtom,GlobalFree,GlobalGetAtomName)
-esym(534,LocalFree,LocalUnlock,LockResource,lstrcpy,OpenClipboard)
-esym(534,Pie,PlayMetaFile,PopFindNextText,PostDataMessage,PostMessage)
-esym(534,RestoreDC,SaveDC,SelectClipRgn,SendDlgItemMessage,SetClipboardData)
-esym(534,SetDIBitsToDevice,SetMapMode,SetMapperFlags,SetROP2,SetStretchBltMode)
-esym(534,SetTextJustification,SetTimer,SetViewportExt,SetViewportOrg)
-esym(534,SetWindowExt,SetWindowOrg,StretchDIBits,WinExec)
// Ignored parameters
-esym(715,lpszCmdParam,lpszCmdLine)
-emacro(648,PSN_*) // ignore unsigned overflow (0-200U)

View File

@ -0,0 +1,85 @@
# This file contains functions and configurations for generating PC-Lint build
# targets for your CMake projects.
set(PC_LINT_EXECUTABLE "C:/Lint/lint-nt.exe" CACHE STRING "full path to the pc-lint executable. NOT the generated lin.bat")
set(PC_LINT_CONFIG_DIR "${PROJECT_SOURCE_DIR}/lint/msvc" CACHE STRING "full path to the directory containing pc-lint configuration files")
set(PC_LINT_USER_FLAGS "-b" CACHE STRING "additional pc-lint command line options -- some flags of pc-lint cannot be set in option files (most notably -b)")
# a phony target which causes all available *_LINT targets to be executed
add_custom_target(ALL_LINT)
# add_pc_lint(target source1 [source2 ...])
#
# Takes a list of source files and generates a build target which can be used
# for linting all files
#
# The generated lint commands assume that a top-level config file named
# 'std.lnt' resides in the configuration directory 'PC_LINT_CONFIG_DIR'. This
# config file must include all other config files. This is standard lint
# behaviour.
#
# Parameters:
# - target: the name of the target to which the sources belong. You will get a
# new build target named ${target}_LINT
# - source1 ... : a list of source files to be linted. Just pass the same list
# as you passed for add_executable or add_library. Everything except
# C and CPP files (*.c, *.cpp, *.cxx) will be filtered out.
#
# Example:
# If you have a CMakeLists.txt which generates an executable like this:
#
# set(MAIN_SOURCES main.c foo.c bar.c)
# add_executable(main ${MAIN_SOURCES})
#
# include this file
#
# include(/path/to/pc_lint.cmake)
#
# and add a line to generate the main_LINT target
#
# if(COMMAND add_pc_lint)
# add_pc_lint(main ${MAIN_SOURCES})
# endif(COMMAND add_pc_lint)
#
function(add_pc_lint target)
get_directory_property(lint_include_directories INCLUDE_DIRECTORIES)
get_directory_property(lint_defines COMPILE_DEFINITIONS)
# let's get those elephants across the alps
# prepend each include directory with "-i"; also quotes the directory
set(lint_include_directories_transformed)
foreach(include_dir ${lint_include_directories})
list(APPEND lint_include_directories_transformed -i"${include_dir}")
endforeach(include_dir)
# prepend each definition with "-d"
set(lint_defines_transformed)
foreach(definition ${lint_defines})
list(APPEND lint_defines_transformed -d${definition})
endforeach(definition)
# list of all commands, one for each given source file
set(pc_lint_commands)
foreach(sourcefile ${ARGN})
# only include c and cpp files
if( sourcefile MATCHES \\.c$|\\.cxx$|\\.cpp$ )
# make filename absolute
get_filename_component(sourcefile_abs ${sourcefile} ABSOLUTE)
# create command line for linting one source file and add it to the list of commands
list(APPEND pc_lint_commands
COMMAND ${PC_LINT_EXECUTABLE}
-i"${PC_LINT_CONFIG_DIR}" std.lnt
"-u" ${PC_LINT_USER_FLAGS}
${lint_include_directories_transformed}
${lint_defines_transformed}
${sourcefile_abs})
endif()
endforeach(sourcefile)
# add a custom target consisting of all the commands generated above
add_custom_target(${target}_LINT ${pc_lint_commands} VERBATIM)
# make the ALL_LINT target depend on each and every *_LINT target
add_dependencies(ALL_LINT ${target}_LINT)
endfunction(add_pc_lint)

View File

@ -0,0 +1,4 @@
co-msc100.lnt
env-vc10.lnt
lib-w32.lnt

View File

@ -0,0 +1,60 @@
/**
\mainpage XCP Seed and Key shared library (SeedNKey)
\details
\tableofcontents
\section into Introduction
The OpenBLT bootloader is an open source project, allowing everyone to access the
sources. One downside of this is that if someone knows the OpenBLT bootloader is used
in your product, it is relatively easy for them to figure out how to update the
firmware in your product. Although this could be a feature of your product, in most
cases it is not desirable.
For this reason the bootloader contains a seed/key security module. If this security
module is enabled in the bootloader's configuration, updates can only be made by users
that have the correct algorithm inside this Seed and Key shared library. If not, then
new firmware update requests are rejected by the bootloader.
The SeedNKey project is preconfigured to build this Seed and Key shared library. Its
default implemented seed and key algorithm works together with those implemented in
the OpenBLT demo bootloaders. You are free and encouraged to update this algorithm to
match your security needs.
On the bootloader target side (microcontroller), this security module is enabled by
setting configurable BOOT_XCP_SEED_KEY_ENABLE to a value of 1 in the bootloader's
configuration header file (blt_conf.h). The implementation of the seed and key algorithm
can be made in the hook-functions XcpGetSeedHook() and XcpVerifyKeyHook().
On the host side (PC), you simply specify the Seed and Key shared library file that this
preconfigured project built. In MicroBoot this shared library can be specified through
the settings user interface. In BootCommander it is specified via a command line option.
Refer to the OpenBLT website for additional information regarding the XCP Seed and Key
shared library, including step-by-step instructions on how to build it:
https://www.feaser.com/openblt/doku.php?id=manual:security
php?id=manual:libopenblt.
\verbatim
----------------------------------------------------------------------------------------
C O P Y R I G H T
----------------------------------------------------------------------------------------
Copyright (c) 2017 Feaser. All rights reserved.
----------------------------------------------------------------------------------------
L I C E N S E
----------------------------------------------------------------------------------------
This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
modify it under the terms of the GNU General Public License as published by the Free
Software Foundation, either version 3 of the License, or (at your option) any later
version.
OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the GNU General Public License for more details.
You have received a copy of the GNU General Public License along with OpenBLT. It
should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
----------------------------------------------------------------------------------------
\endverbatim
*/

View File

@ -0,0 +1,118 @@
/************************************************************************************//**
* \file seednkey.c
* \brief XCP Seed and Key shared library source file.
* \ingroup SeedNKey
* \internal
*----------------------------------------------------------------------------------------
* C O P Y R I G H T
*----------------------------------------------------------------------------------------
* Copyright (c) 2017 by Feaser http://www.feaser.com All rights reserved
*
*----------------------------------------------------------------------------------------
* L I C E N S E
*----------------------------------------------------------------------------------------
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You have received a copy of the GNU General Public License along with OpenBLT. It
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
*
* \endinternal
****************************************************************************************/
/****************************************************************************************
* Include files
****************************************************************************************/
#include <assert.h> /* for assertions */
#include <stddef.h> /* for NULL declaration */
#include "seednkey.h" /* XCP seed and key */
/************************************************************************************//**
** \brief Computes the key for the requested resource.
** \param resource resource for which the unlock key is requested
** \param seedLen length of the seed
** \param seedPtr pointer to the seed data
** \param keyLenPtr pointer where to store the key length
** \param keyPtr pointer where to store the key data
** \return XCP_RESULT_OK on success, otherwise XCP_RESULT_ERROR.
**
****************************************************************************************/
LIBOPENBLT_EXPORT uint32_t XCP_ComputeKeyFromSeed(uint8_t resource, uint8_t seedLen,
uint8_t const * seedPtr,
uint8_t * keyLenPtr,
uint8_t * keyPtr)
{
uint32_t result = XCP_RESULT_ERROR;
uint8_t idx;
/* Check parameters. */
assert(seedLen > 0);
assert(seedPtr != NULL);
assert(keyLenPtr != NULL);
assert(keyPtr != NULL);
/* Only continue if the parameters are valid. */
if ( (seedLen > 0) && (seedPtr != NULL) && (keyLenPtr != NULL) &&
(keyPtr != NULL) ) /*lint !e774 */
{
/* This example implementation of the key algorithm for PGM simply decrements the value
* of each seed byte by 1. This coincides with the default implementation of the hook-
* function XcpVerifyKeyHook() in the OpenBLT demo bootloaders.
*/
if (resource == XCP_RESOURCE_PGM)
{
/* Compute the key. */
for (idx = 0; idx < seedLen; idx++)
{
keyPtr[idx] = seedPtr[idx] - 1;
}
/* Set the key length. */
*keyLenPtr = seedLen;
/* Update the result value. */
result = XCP_RESULT_OK;
}
}
/* Give the result back to the caller. */
return result;
} /*** end of XCP_ComputeKeyFromSeed ***/
/************************************************************************************//**
** \brief Computes the key for the requested resource.
** \param resourcePtr pointer where to store the supported resources for the key
** computation.
** \return XCP_RESULT_OK on success, otherwise XCP_RESULT_ERROR.
**
****************************************************************************************/
LIBOPENBLT_EXPORT uint32_t XCP_GetAvailablePrivileges(uint8_t * resourcePtr)
{
uint32_t result = XCP_RESULT_ERROR;
/* Check parameters. */
assert(resourcePtr != NULL);
/* Only continue if the parameter is valid. */
if (resourcePtr != NULL) /*lint !e774 */
{
/* This example implementation supports a key computation algorithm for the PGM
* resource.
*/
*resourcePtr = XCP_RESOURCE_PGM;
/* Update the result value. */
result = XCP_RESULT_OK;
}
/* Give the result back to the caller. */
return result;
} /*** end of XCP_GetAvailablePrivileges ***/
/*********************************** end of seednkey.c *********************************/

View File

@ -0,0 +1,107 @@
/************************************************************************************//**
* \file seednkey.h
* \brief XCP Seed and Key shared library header file.
* \ingroup SeedNKey
* \internal
*----------------------------------------------------------------------------------------
* C O P Y R I G H T
*----------------------------------------------------------------------------------------
* Copyright (c) 2017 by Feaser http://www.feaser.com All rights reserved
*
*----------------------------------------------------------------------------------------
* L I C E N S E
*----------------------------------------------------------------------------------------
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You have received a copy of the GNU General Public License along with OpenBLT. It
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
*
* \endinternal
****************************************************************************************/
/************************************************************************************//**
* \defgroup SeedNKey XCP Seed/Key
* \brief XCP Seed and Key shared library.
* \details
* This shared library implements an example XCP Seed and Key protection algorithm. If the
* OpenBLT bootloader on the microcontroller is configured to support this protection,
* this shared library file must be configured in the firmware update tool on the host
* (for example MicroBoot or BootCommander). The OpenBLT bootloader will reject new
* firmware update requests, if an incorrect XCP Seed and Key protection algorithm is
* specified.
*
* You are free and even encouraged to change the protection algorithm in this shared
* library to however you see fit to protect your target from unwanted firmware updates.
****************************************************************************************/
#ifndef SEEDNKEY_H
#define SEEDNKEY_H
#ifdef __cplusplus
extern "C" {
#endif
/****************************************************************************************
* Include files
****************************************************************************************/
#include <stdint.h> /* for standard integer types */
/****************************************************************************************
* Macro definitions
****************************************************************************************/
/* CMake automatically defines macro seednkey_shared_EXPORTS when building the shared
* version of the library. When building under windows, this is used to set the export
* macro, which is needed to confige the library functions.
*/
#if defined(_WIN32) || defined(_WIN64)
#if defined(seednkey_shared_EXPORTS)
#define LIBOPENBLT_EXPORT __declspec(dllexport)
#else
#define LIBOPENBLT_EXPORT
#endif /* seednkey_shared_EXPORTS */
#else /* defined(_WIN32) || defined(_WIN64) */
#define LIBOPENBLT_EXPORT
#endif
/* Result values. */
/** \brief Result value in case of success. */
#define XCP_RESULT_OK (0u)
/** \brief Result value in case of error. */
#define XCP_RESULT_ERROR (1u)
/* XCP supported resources. */
/** \brief XCP ProGraMing resource. */
#define XCP_RESOURCE_PGM (0x10u)
/** \brief XCP data STIMulation resource. */
#define XCP_RESOURCE_STIM (0x08u)
/** \brief XCP Data AcQuisition resource. */
#define XCP_RESOURCE_DAQ (0x04u)
/** \brief XCP CALibration and PAGing resource. */
#define XCP_RESOURCE_CALPAG (0x01u)
/****************************************************************************************
* Function prototypes
****************************************************************************************/
LIBOPENBLT_EXPORT uint32_t XCP_ComputeKeyFromSeed(uint8_t resource, uint8_t seedLen,
uint8_t const * seedPtr,
uint8_t * keyLenPtr,
uint8_t * keyPtr);
LIBOPENBLT_EXPORT uint32_t XCP_GetAvailablePrivileges(uint8_t * resourcePtr);
#ifdef __cplusplus
}
#endif
#endif /* SEEDNKEY_H */
/********************************* end of seednkey.h ***********************************/

BIN
Host/libseednkey.dll Normal file

Binary file not shown.

Binary file not shown.

View File

@ -6,7 +6,7 @@ extended=0
txid=1639
rxid=2017
[xcp]
seedkey=
seedkey=libseednkey.dll
t1=1000
t3=2000
t4=10000

Binary file not shown.

View File

@ -6,7 +6,7 @@ extended=0
txid=1639
rxid=2017
[xcp]
seedkey=FeaserKey.dll
seedkey=libseednkey.dll
t1=1000
t3=2000
t4=10000

Binary file not shown.

View File

@ -6,7 +6,7 @@ extended=0
txid=1639
rxid=2017
[xcp]
seedkey=FeaserKey.dll
seedkey=libseednkey.dll
t1=1000
t3=2000
t4=10000

Binary file not shown.

View File

@ -2,7 +2,7 @@
hostname=169.254.19.63
port=1000
[xcp]
seedkey=FeaserKey.dll
seedkey=libseednkey.dll
t1=1000
t3=2000
t4=10000

Binary file not shown.

View File

@ -1,8 +1,8 @@
[sci]
port=9
port=5
baudrate=8
[xcp]
seedkey=FeaserKey.dll
seedkey=libseednkey.dll
t1=1000
t3=2000
t4=10000

Binary file not shown.

View File

@ -1,5 +1,5 @@
[xcp]
seedkey=FeaserKey.dll
seedkey=libseednkey.dll
t1=1000
t3=2000
t4=10000