发现一个Delphi的静态代码检查工具FixInsight

C++,Java, C#等常用编程语言都有静态代码检查工具,帮助发现编写代码过程中存在的一些问题,从而有效提升代码质量,将一些缺陷在编译阶段就发现解决掉。
Delphi作为一个已经有几十年历史的语言,一直没有发现类似的静态代码检查工具,引以为憾,但是今天发现了一款工具 FixInsight 填补了这个缺憾。
下载地址 http://sourceoddity.com/fixinsight/download.html
软件的售价对于个人版只要 $95, 相对于排查代码缺陷所花的时间是完全值得的。

Popularity: 9% [?]

Random Posts

使用CodeTyphon做FPC交叉编译的问题记录

在mac下安装了CodeTyphon尝试做freepascal代码的跨平台编译。

首先编译安装CodeTyphon环境

步骤1:安装 mac ports
步骤2:首先解压下载来的CodeTyphon安装包,运行解压目录下下的setup.sh, 使用 sudo 执行
步骤3:选择0,安装系统库
步骤4:选择8, 清空之前的全部组件,重新编译安装
经过漫长等待后,可以在应用程序中看到有CodeTyphon和Typhon32两个图标,运行CodeTyphon

编译所需目标平台的工具链

主要是CrossBuild菜单项目下的几个菜单项处理。
步骤1:选择 CrossBuild 菜单下面的 ToolChains Build 项目,选择期望的目标平台,主要是第一列的 FPC CPU-OS Targets 中选择, 选择好后点击 Build 按钮进行编译。在自己手动编译前可以先选择 CrossBuild 菜单下面的 Download ToolChains项目,看服务器上有无预先编译好的可可以下载来用(手工编译速度比下载速度慢很多)下载前,要用sudo 运行CodeTyphon, 否则会下载失败,提示目录不存在的错误,其实就是没有权限写目录
步骤2:选择 CrossBuild 菜单下的 Download Libaraies 项目,下载对应目标平台的库文件
步骤3:选择 CrossBuild 菜单下的 FreePascal 32bits(64bits), 编译所需平台的 cross elements,
如果没有做第一步, 则这儿没有对应平台的cross elements可以选择

编译目标平台的程序

步骤1. 运行Typhon32
步骤2. 新建或打开工程
步骤3. 设置工程的相关搜索路径,菜单 工程=》工程选项=》编译选项=》路径, 主要为Libraries路径,为了变更目标平台时不修改这边的路径,可以采用相对路径。
Libraries 可以填 $(CTDir)/binLibraries/$(TargetCPU)-$(TargetOS)
单元输出目录可以填 lib/$(TargetCPU)-$(TargetOS)
步骤4. 选择目标平台,菜单 工程=》工程选项=》Config and Target, 设置目标OS和目标CPU

编译中碰到问题:
问题1: 编译提示 system 单元未找到
这一般是由于没有创建好对应平台的cross elements 或者 在工程的路径设置中没有设置对 units的路径

问题2: 代码中的中文信息在编译后输出了乱码
这个一般是由于Freepascal默认按照utf8解释的原因,之前代码中的中文是在Win下编写,GBK编码,将文件转为UTF8格式重新编译问题解决。

Popularity: 9% [?]

Random Posts

Klocwork Insight在Mac下的eclipse插件安装使用

搞到一套可以在mac下运行的klocwork insight,终于在不开虚拟机的情况下也可以做c/c++代码的静态检查了。
首先安装服务端,双击运行服务端安装包的 pkg文件,安装后会自动建立 /usr/local/kw/ 符号连接,
再安装客户端,解压客户端的zip压缩包,得到cmd安装包盒eclipse的update site。双击运行cmd客户端安装包的pkg文件进行安装。

使用eclipse的install site将eclipse插件装好,
修改eclipse中的 c++项目build属性
1. 选中项目,鼠标右击,转到 Project Properties > C/C++ Build > Tool Chain Editor.
2. 将活动配置的 Current Builder 从 CDT Internal Builder 修改为 Gnu Make Builder 并点击 Apply .
3. 选中项目,鼠标右击,转到 Project Properties > C/C++ Build.
4. 在Builder Settings 标签页, 取消选中 Use default build command.
5.在 Build command 输入框中,将原先的 make 修改为

kwinject -u -o ${ProjDirPath}/kwinject.out make

注意:要将之前安装的路径添加到PATH中,否则会报kwinject命令找不到的错误
6. 点击 OK 按钮确定修改

首先 clean project, 然后再build project这样就创建好了klocwork的 Build specification。

7. 选中项目,鼠标右击,转到 Project Properties – > Klocwork > Clockwork Build Settings.
8. 选中 Use build specification file, 浏览选中刚创建的 build specification 文件 ( kwinjec.out ), 然后点击 OK.

后面就可以使用klocwork分析C++代码中存在的问题了。

命令行下运行

kwadmin create-project myproject
cd myprojectpath
make clean
kwinject make
kwbuildproject --project myproject -f -o table kwinject.out
kwadmin load myproject table

在客户端分析
首先进入到项目所在的路径(工程所在的路径下)
1. 创建本地项目名
kwcheck create 会在当前目录下生成一个 .kwlp .kwps 的目录,用来存放数据和配置文件的
2. 获取构建配置文件
kwbuildproject –project myproject -f -o table kwinject.out

用命令分析并查看结果
kwcheck run –b kwinject.out

这时缺陷是不能在 web 中查看的但可以导出 txt 和 xml 格式的文件,命令为:
kwcheck list -F xml > report.xml
kwcheck list -F detailed > report.txt

Popularity: 9% [?]

Random Posts

尝试安装使用Checkmarx过程中碰到的问题解决方法记录

最近找到了一份Checkmarx安装包,这是一款比较强大的用于静态分析源代码,找出代码中可能存在的安全漏洞,
对常见的语言都有支持,比如ASP,PHP,Rubby,Python,JavaScript,CSharp,Java等

在尝试安装使用的过程中碰到了如下一些问题:

  1. 使用的SQLServer数据库连接不上
  2. 开始默认安装的系统认证方式连接数据库,结果启动服务时起不来,看日志为数据库连接不上,提示NT Authrity失败,于是尝试使用SQLServer的认证,修改Config目录下的数据库连接配置文件,添加上User Id,Password数据库连接账号,重新启动Checkmarx的服务,发现还是连不上,查看SQL Server的文档,发现Integrated Security要设置为False值,否则还是会忽略数据库的账号密码,使用系统认证连接数据库。再次修改后,重新启动服务,启动成功。

  3. Git版本库连接不上
  4. 添加要扫描的项目代码时,使用Git版本库作为来源,但是总是提示ssh认证不通过,最后发现使用git2.x的客户端不行,网上找了一个git1.9的客户端在Checkmarx的扫描服务器上重新安装,问题解决。

  5. 使用中文界面,部分漏洞的中文说明显示为乱码
  6. 分析显示的文字,感觉是没有正确采用编码显示,感觉像utf-8编码未能正常显示,在数据库服务器上打开CxDB数据库,找到cwe表,看到里面有LanguageId为2052的Description字段中文字有中文,抽样看了一些字段中数据值,部分正常显示中文,部分显示出来为乱码。写了一个小工具,对显示不正常的记录数据读取出啦,转为Utf8编码重新保存到数据库中(一共200多条中文描述记录中有90来条乱码),Web页面上原先显示不正常的中文显示正常。但是生成的中文报告,原先乱码的在报告中还是乱码,应该需要修订另外一个字段中的值。

Popularity: 9% [?]

Random Posts

使用Insure编译代码出现Warning: unable to instrument “xxx.cpp” (4) compiling original source code

使用Insre工具做代码的内存泄露检查,编译代码时发现提示 Warning: unable to instrument “xxx.cpp” (4) compiling original source code,没有能正常插桩, 对代码逐步分析排除问题后,发现是代码中使用了 jsoncpp 库,Insure编译时对jsoncpp的头文件没有能处理好,只要引用到了json.h的代码文件,都出现了 Warning: unable to instrument 的提示。

逐个尝试修改jsoncpp的头文件做分析,最后发现只要修改jsoncpp的 value.h 文件,
将 class JSON_API value 类下面

private:
#ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
# ifndef JSON_VALUE_USE_INTERNAL_MAP
    class CZString
   {

的private:修改为public:变为

public:
#ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
# ifndef JSON_VALUE_USE_INTERNAL_MAP
    class CZString
   {

后,重新使用Insure编译,正常插桩,编译通过,未再提示 warning: unable to instrument 错误。

Popularity: 9% [?]

Random Posts

SOATest浅尝使用脚本设置HTTP请求参数

SOATest是Parasoft公司的一款测试工具,功能强大,可以用于Http接口测试。通常指定好接口地址,设置好输入参数列表后,即可获得接口数据做检查。
碰到一个http请求要做参数签名的情况,请求需要添加两个参数,
_timestamp 请求发生时的Unixtime 时间戳
_sign 对所有参数值排序后连接起来,和一个协商好的 secret 值做md5运算 _sign=md5(secret + 排序后的参数值字符串 + secret)

这两个参数不能在输入时确定,需要在发生请求是动态生成,因此需要写脚本来设置。
翻看了SOAtest的用户手册 和 SOAtest Extensibility API帮助文档,没有找到获取请求参数列表的方法,
经过多番研究尝试,最终搞定,脚本如下

脚本1. 获取时间戳值

from java.util import *
from java.text import *
from java.lang import *

def getTime():
  calendar = Calendar.getInstance()

  date = calendar.getTime()

  ts = date.getTime() / 1000
  return ts

脚本2. 获取参数列表后,对参数列表做签名计算

from com.parasoft.api import *
from webtool.data import *
from java.lang import *
from java.util import HashMap
from java.security import *

#计算参数签名
def getParamsSign(context):
    mc = context.getTool()
    params = mc.getURLParams()
    names = []
    mp = HashMap()
    for p in params:
        name = p.getName()
        if name != "_sign":
            value = p.getValue(context)
            mp.put(name,value)  # 将需要签名的参数放到列表中存起来
            names += [name]
            #Application.showMessage('param ' + name + ' value '+ value)
        else:
            #Application.showMessage('param _sign value ' + p.getActualValue())  #不能调用p.getValue(context), 会触发死循环  

    #拼装要签名的字符串
    names.sort()
    tosign = ''
    for k in names: #mp.keySet():
        tosign += k;
        tosign += mp.get(k)
    secret = context.getEnvironmentVariableValue('client_secret')
    tosign = secret + tosign + secret
    Application.showMessage('tosign:' + tosign)

    #作签名运算
    md5Inst = MessageDigest.getInstance('MD5')
    md5Inst.update(tosign.encode('utf-8'))
    hexDigits = '0123456789abcdef'
    md = md5Inst.digest()
    signed = ''
    for v in md:
        t = v >> 4 & 0x0f
        signed += hexDigits[t]
        t = v & 0x0f
        signed += hexDigits[t]
    Application.showMessage('signed:' + signed)
    #返回签名结果
    return signed

注意要点,在获取参数列表时,用于参数签名的 _sign 字段名要刨除在外,否则获取_sign值时会触发脚本,陷入死循环

Popularity: 9% [?]

Random Posts

Concerto在Linux下安装成中文版本

近日搞到一套Parasoft公司的Concerto,
在Linux下安装后,
使用 ./concertoconsole.sh 命令
开启服务运行后

浏览器界面打开总是英文,而该公司的产品是有做过中文化的,
经过一番研究,发现安装程序是自动根据系统环境变量来设置安装得语言包得。
简单验证方法,在Linux下输入命令 date 看输出的日期格式,
看到的是英文的日期,安装后的显示界面(Report Center 和 Project Center) 是英文的。
看到的是中文的日期,则安装后得使用界面就是中文的。

如果显示是英文,但是想要安装成中文的,可以对linux系统做如下设置
修改 /etc/sysconfig/i18n 文件,将其中内容修改为

#LANG="en_US.UTF-8"
#SYSFONT="latarcyrheb-sun16"

LANG="zh_CN.UTF-8"
SYSFONT="latarcyrheb-sun16"
SUPPORTED="zh_CN.UTF-8:zh_CN:zh"

删除之前安装文件,重新安装,再次打开界面,登录后看到期待已久得中文界面了。

安装成中文使用界面后在实际使用中发现另外一个问题,
Dashboard 先显示的报告图片的标题的中文显示的是一个一个小方框,
估计是使用了什么对中文支持不是很好的库,有待进一步研究修订。

Popularity: 8% [?]

Random Posts

浅尝内存泄露检查工具Insure++在Linux_X64平台下得使用

首先安装Insure++, 按照说明展开安装文件install后,运行.install进行安装,一路默认值下去安装成功
使用:

第一步

修改profile文件,将insure的bin路径添加到PATH中

export PATH=$PATH:~/insure/bin

第二步

重新建立终端连接,到项目目录下检查修改Makefile文件
如果直接使用g++的,需要修改每一个g++为 insure g++
还好我是使用的CXX=g++方式,需要insure编译时只要在执行命令的时候使用

make CXX="insure g++"

即可,不用修改文件,就可以方便切换insure++编译版本和非Insure++编译版本
重新编译前,要先执行

make clean

做目录清理

第三步

运行编译后得程序,做内存泄露检查,呵呵一下看到一堆提示,慢慢研究提示信息含义。
后续代码效率、覆盖等功能等待进一步研究。

使用insure++编译过程中碰到的一个问题
所有文件编译完成后,在最后链接阶段提示

/usr/bin/ld: cannot find -ldl

这个在未使用insure++编译前,是没有出现这个错误得,
首先尝试修改 ~/insure/.psrc 文件,添加了

insure++.static_linking on

开关行,使用静态编译方式,结果链接时出现缺少一些inusre目录下得.a, .o文件,行不通
继续网上搜索,发现是少了符号链接 /usr/lib64/libdl.so,添加符号链接

ln -s /lib64/libdl.so.2 /usr/lib64/libdl.so

重新编译连接,问题消失,可以正常编译链接。

Popularity: 8% [?]

Random Posts

初试Coverity对C++代码的静态检查

之前一直在使用一个版本的goanna做C++静态代码,前两天搞到一套Coverity,尝试安装了一下,发现Coverity检查功能还是挺强大,之前goanna未检查出得一些问题它检查出来了,比如
if ((x & 0×80) == 1)) {
}
这么一个判断代码,之前的goanna就没有报出问题,这个Coverity就报出了一个无效语句的问题,一下子发现等于的判断条件写错了。
Coverity的简单使用流程
第一步, 使用 cov-build 捕获代码Build过程涉及到得文件

./cov-build --dir . make

第二步, 使用 cov-analysis 对捕获的结果做代码分析(分析在cov-build步骤捕获到得相关代码文件)

./cov-analysis --dir .

第三步, 使用 cov-format-errors 输出html格式的分析结果,方便查看出问题得代码位置做代码修订。(这一步也可以使用 cov-commit-defects 提交分析结果到中心服务器,没有安装 platform 没有做效果尝试)

./cov-format-errors --dir . --html-output ./html

打开html目录下的 index.html 即可查看分析结果。

Popularity: 8% [?]

Random Posts

FAST-REPORT FMX 完全手工编译安装方法

FAST-REPORT FMX 安装包针对每个版本的Delphi都做了安装包,如果Delphi的环境是默认的没有经过一些库文件的升级,比如将TeeChart控件升级到专业版使用,则默使用认安装包安装后,会有异常,需要自己使用源码重新编译安装。查看了安装目录下的txt文件,有篇中提到只要使用recompile.exe,按照提示选择设置对应参数重新编译即可,可是不幸的是在安装目录下并没有recompile.exe文件,只能完全的手工安装了。
首先卸载已经安装的FASTREPORT FMX,然后只安装源码包。
按照如下顺序安装 (以DelphiXE4为例)
1. 打开FastReport FMX\FastScript\FMXfs18.dpk–》编译(Compile)
打开FastReport FMX\FastScript\dclFMXfs18.dpk–》编译(Compile)–》安装(Install)
2. 打开FastReport FMX\FastScript\FMXfsDB18.dpk–》编译(Compile)
打开FastReport FMX\FastScript\dclFMXfsDB18.dpk–》编译(Compile)–》安装(Install)
3. 按照需要编译DB,TEE模块,如果是TEE模块,记得修改tee.inc文件,对应到机器上的TeeChar版本
4. 新建一个FastReport FMX\LibD18目录,复制FastReport FMX\Source\*.*到这个LibD18目录
5. 打开FastReport FMX\LibD18\FMXfrx18.dpk–》编译(Compile)
打开FastReport FMX\LibD18\dclFMXfrx18.dpk–》编译(Compile)–》安装(Install)
6. 打开FastReport FMX\LibD18\FMXfrxDB18.dpk–》编译(Compile)
打开FastReport FMX\LibD18\FMXfrxDB18.dpk–》编译(Compile)–》安装(Install)
7.按照自己的需要,编译DB,TEE等模块,如果要安装Tee模块,记得从FastScript目录下将tee.inc拷贝过来,要不然编译有问题。

编译过程中会遇到一些控件缺少属性的提示,直接忽略所有即可。

Popularity: 8% [?]

Random Posts

← Previous PageNext Page →