首页 文章 精选 留言 我的

精选列表

搜索[Bug修复],共10000篇文章
优秀的个人博客,低调大师

GrammaTech 推出 API bug 检测工具,美国国土安全部赞助

安全测试解决方案公司GrammaTech 推出了一个名为 Swap Detector 的开源工具,可用来检测应用程序编程接口(API)使用错误。 Swap Detector 是美国国土安全部科技局静态工具分析现代化项目(Static Tool Analysis Modernization Project,STAMP)赞助的研究项目的一部分,可改善 DevOps 团队的应用安全测试。该工具可以让开发人员和 DevOps 团队能够识别由于交换函数参数导致的错误(这些错误也可能存在于部署的代码中)。 GrammaTech 研究副总裁 Alexey Loginov 称,“传统的静态分析技术并没有利用开源领域现有的代表无错误编码实践的大量信息。通过Swap Detector,我们将大数据分析技术,也就是我们所说的 Big Code分析,应用到 Fedora RPM 开源库中,以确定正确的 API 使用基准。这让我们开发的错误检测能力远远超过了传统程序分析方法的可扩展性和准确性。” Swap Detector 接口集成了各种静态分析工具,例如 Clang Static Analyzer、Clang-Tidy 和 PyLint。最初,Swap Detector 的研发侧重于C/C++ 程序方面,但如今其已适用于其他语言的程序,特别是对解释型和非编译型的语言来说非常有利。 Swap Detector 采用多种错误检测技术,并将它们层叠在一起以提高准确性。例如,将调用站点中使用的参数名称与相应声明中使用的参数名称进行比较。此外,它还使用了“Big Code”技术,应用从大量代码样本中收集的已知良好 API 使用模式的使用情况的统计信息,并将统计上异常的使用情况标记为潜在的错误。为了提高报告警告的精度,Swap Detector 还对这两种技术的输出采用了减少假阳性的策略。

优秀的个人博客,低调大师

C语言大牛推荐初学者不要犯的17种BUG

C语言的最大特点是:功能强、使用方便灵活。C编译的程序对语法检查并不象其它高级语言那么严格,这就给编程人员留下“灵活的余地”。 但由于这个灵活给程序的调试带来了许多不便,尤其对初学C语言的人来说,经常会出一些连自己都不知道错在哪里的错误。看着有错的程序,不知该如何改起,我们通过对C的学习,积累了一些C编程时常犯的错误,写给各位小伙伴以供参考。 一.书写标识符时,忽略了大小写字母的区别 main(){ int a=5; printf("%d",A);} 编译程序把a和A认为是两个不同的变量名,而显示出错信息。 C认为大写字母和小写字母是两个不同的字符。 习惯上,符号常量名用大写,变量名用小写表示,以增加可读性。 二.忽略了变量的类型,进行了不合法的运算 代码如下: main(){ float a,b; printf("%d",a%b);} %是求余运算,得到a/b的整余数。 整型变量a和b可以进行求余运算,而实型变量则不允许进行“求余”运算。 三.将字符常量与字符串常量混淆 char c; c=”a”; 在这里就混淆了字符常量与字符串常量,字符常量是由一对单引号括起来的单个字符,字符串常量是一对双引号括起来的字符序列。 C规定以“”作字符串结束标志,它是由系统自动加上的,所以字符串“a”实际上包含两个字符:‘a’和‘’,而把它赋给一个字符变量是不行的。 四.忽略了“=”与“==”的区别 在许多高级语言中,用“=”符号作为关系运算符“等于”。如在BASIC程序中可以写 if (a=3) then … 但C语言中,“=”是赋值运算符,“==”是关系运算符。如: if (a==3) a=b; 前者是进行比较,a是否和3相等,后者表示如果a和3相等,把b值赋给a。由于习惯问题,初学者往往会犯这样的错误。 五.忘记加分号 分号是C语句中不可缺少的一部分,语句末尾必须有分号。 a=1 b=2 编译时,编译程序在“a=1”后面没发现分号,就把下一行“b=2”也作为上一行语句的一部分,这就会出现语法错误。 改错时,有时在被指出有错的一行中未发现错误,就需要看一下上一行是否漏掉了分号。 代码如下: { z=x+y; t=z/100; printf("%f",t);} 对于复合语句来说,最后一个语句中最后的分号不能忽略不写(这是和PASCAL不同的)。 六.多加分号 对于一个复合语句,代码如下: { z=x+y; t=z/100; printf("%f",t);}; 复合语句的花括号后不应再加分号,否则将会画蛇添足。又如: if (a%3==0); I++; 本是如果3整除a,则I加1。但由于if (a%3==0)后多加了分号,则if语句到此结束,程序将执行I++语句,不论3是否整除a,I都将自动加1。再如: for (I=0;I<5;I++); {scanf(“%d”,&x); printf(“%d”,x);} 本意是先后输入5个数,每输入一个数后再将它输出。由于for()后多加了一个分号,使循环体变为空语句,此时只能输入一个数并输出它。 七.输入变量时忘记加地址运算符“&” int a,b; scanf(“%d%d”,a,b); 这是不合法的。Scanf函数的作用是:按照a、b在内存的地址将a、b的值存进去。“&a”指a在内存中的地址。 八.输入数据的方式与要求不符 ①scanf(“%d%d”,&a,&b); 输入时,不能用逗号作两个数据间的分隔符,如下面输入不合法: 3,4 输入数据时,在两个数据之间以一个或多个空格间隔,也可用回车键,跳格键tab。 ②scanf(“%d,%d”,&a,&b); C规定:如果在“格式控制”字符串中除了格式说明以外还有其它字符,则在输入数据时应输入与这些字符相同的字符。下面输入是合法的: 3,4 此时不用逗号而用空格或其它字符是不对的。 3 4 3:4 又如: scanf(“a=%d,b=%d”,&a,&b); 输入应如以下形式: a=3,b=4 九.输入字符的格式与要求不一致 在用“%c”格式输入字符时,“空格字符”和“转义字符”都作为有效字符输入。 scanf(“%c%c%c”,&c1,&c2,&c3); 如输入a b c 字符“a”送给c1,字符“ ”送给c2,字符“b”送给c3,因为%c只要求读入一个字符,后面不需要用空格作为两个字符的间隔。 十.输入输出的数据类型与所用格式说明符不一致 例如,a已定义为整型,b定义为实型 a=3;b=4.5; printf(“%f%d ”,a,b); 编译时不给出出错信息,但运行结果将与原意不符。这种错误尤其需要注意。 十一.输入数据时,企图规定精度 scanf(“%7.2f”,&a); 这样做是不合法的,输入数据时不能规定精度。 十二.switch语句中漏写break语句 例如:根据考试成绩的等级打印出百分制数段。 switch(grade) { case ‘A’:printf(“85~100 ”); case ‘B’:printf(“70~84 ”); case ‘C’:printf(“60~69 ”); case ‘D’:printf(“<60 ”); default:printf(“error ”); } 由于漏写了break语句,case只起标号的作用,而不起判断作用。 因此,当grade值为A时,printf函数在执行完第一个语句后接着执行第二、三、四、五个printf函数语句。正确写法应在每个分支后再加上“break;”。 例如 case ‘A’:printf(“85~100 ”);break; 十三.忽视了while和do-while语句在细节上的区别 (1) main() {int a=0,I; scanf(“%d”,&I); while(I<=10) {a=a+I; I++; } printf(“%d”,a); } (2) main() {int a=0,I; scanf(“%d”,&I); do {a=a+I; I++; }while(I<=10); printf(“%d”,a); } 可以看到,当输入I的值小于或等于10时,二者得到的结果相同。而当I>10时,二者结果就不同了。 因为while循环是先判断后执行,而do- while循环是先执行后判断。对于大于10的数while循环一次也不执行循环体,而do-while语句则要执行一次循环体。 十四.定义数组时误用变量 int n; scanf(“%d”,&n); int a[n]; 数组名后用方括号括起来的是常量表达式,可以包括常量和符号常量。即C不允许对数组的大小作动态定义。 十五.在定义数组时将定义的“元素个数”误认为是可使的最大下标值 main() {static int a[10]={1,2,3,4,5,6,7,8,9,10}; printf(“%d”,a[10]); } C语言规定:定义时用a[10],表示a数组有10个元素。其下标值由0开始,所以数组元素a[10]是不存在的。 十六.在不应加地址运算符&的位置加了地址运算符 scanf(“%s”,&str); C语言编译系统对数组名的处理是:数组名代表该数组的起始地址,且scanf函数中的输入项是字符数组名,不必要再加地址符&。应改为: scanf(“%s”,str); 十七.同时定义了形参和函数中的局部变量 int max(x,y) int x,y,z; { z=x>y?x:y; return(z); } 形参应该在函数体外定义,而局部变量应该在函数体内定义。应改为: int max(x,y) int x,y; { int z; z=x>y?x:y; return(z); } -

优秀的个人博客,低调大师

Android开发笔记——常见BUG类型之内存泄露与线程安全

一、内存泄露 1、很抱歉,”XXX”已停止运行。OOM? 怎样才能让app报OOM呢?最简单的办法如下: Bitmapbt1=BitmapFactory.decodeResource(this.getResources(),R.drawable.image); Bitmapbt2=BitmapFactory.decodeResource(this.getResources(),R.drawable.image); Bitmapbtn=... 2、查看内存占用 命令行:adb shell dumpsys meminfopackageName 通过Android Studio的Memory Monitor查看内存中Dalvik Heap的实时变化 3、发生内存泄露的条件 首先,每个app有最大内存限制。 ActivityManageractivityManager=(ActivityManager)context.getSystemServiceContext.ACTIVITY_SERVICE); activityManager.getMemoryClass(); getMemoryClass()取到的是最大内存资源。Android中的堆内存分为NativeHeap和DalvikHeap。C/C++申请的内存空间在NativeHeap中,Java申请的内存空间则在DalvikHeap中。对于head堆的大小限制,可以查看/system/build.prop文件: dalvik.vm.heapstartsize=8m dalvik.vm.heapgrowthlimit=96m dalvik.vm.heapsize=256m 注意: heapsize参数表示单个进程heap可用的最大内存,但如果存在以下参数”dalvik.vm.headgrowthlimit =96m”表示单个进程heap内存被限定在96m,即程序运行过程实际只能使用96m内存。 如果申请的内存资源超过上述限制,系统就会抛出OOM错误。 4、常见避免OOM的措施 以下主要从四个方面总结常见的措施:1)减小对象的内存占用;2)内存对象的重复利用;3)避免对象的内存泄露;4)内存使用策略优化。 4.1 减小对象的内存占用 使用ArrayMap/SparseArray而不是HashMap等传统数据结构。 参考链接:Android内存优化(使用SparseArray和ArrayMap代替HashMap) 在Android中避免使用枚举。 减小Bitmap对象的内存占用。inSampleSize和decode format。 4.2 内存对象的重复利用 ListView/GridView等出现大量重复子组件的视图里面对ConvertView的复用 使用LRU机制缓存Bitmap 避免在onDraw方法里面执行对象的创建 使用StringBuilder来替代频繁的”+” 4.3 避免对象的内存泄露 4.1和4.2都是比较常规的措施,4.3需要重点关注。 1)Activity泄露 导致Activity泄露的原因较多,下面列举一些比较常见的。从原理上主要分为两类:i)静态对象;ii)this$0。 Activity被static变量引用。这段代码来自于我们的Crash上传 privatestaticMap<ComponentName,ExceptionHandler>configMap= newHashMap<ComponentName,ExceptionHandler>();publicstaticvoidsetActivity(finalActivityactivity,booleansend2Server){ Log.d(TAG,"bindexceptionhandler:"+activity.getComponentName().getClassName());//上下文初始化SDKContext.init(activity.getApplication()); init(activity.getApplication()); ExceptionHandlerexceptionHandler=newExceptionHandler( activity,send2Server,Thread.getDefaultUncaughtExceptionHandler()); configMap.put(activity.getComponentName(),exceptionHandler); Thread.setDefaultUncaughtExceptionHandler(exceptionHandler); } 下面是通过MAT分析一个Activity泄露的截图: 内部类引用导致Activity的泄漏 最典型的场景是Handler导致的Activity泄漏,如果Handler中有延迟的任务或者是等待执行的任务队列过长,都有可能因为Handler继续执行而导致Activity发生泄漏。此时的引用关系链是Looper -> MessageQueue -> Message -> Handler -> Activity。为了解决这个问题,可以在UI退出之前,执行remove Handler消息队列中的消息与runnable对象。或者是使用Static + WeakReference的方式来达到断开Handler与Activity之间存在引用关系的目的。 可参考链接:线程通信 2)考虑使用Application Context而不是Activity Context 对于大部分非必须使用Activity Context的情况(Dialog的Context就必须是Activity Context),我们都可以考虑使用Application Context而不是Activity的Context,这样可以避免不经意的Activity泄露。 3)注意临时Bitmap对象的及时回收 虽然在大多数情况下,我们会对Bitmap增加缓存机制,但是在某些时候,部分Bitmap是需要及时回收的。例如临时创建的某个相对比较大的bitmap对象,在经过变换得到新的bitmap对象之后,应该尽快回收原始的bitmap,这样能够更快释放原始bitmap所占用的空间。 4)内存占用监控 通过Runtime获取maxMemory,而maxMemory-totalMemory即为剩余可使用的dalvik内存。定期检查这个值,达到80%就去释放各种cache资源(bitmap的cache)。 /** *Returnsthemaximumnumberofbytestheheapcanexpandto.See{@link#totalMemory}forthe *currentnumberofbytestakenbytheheap,and{@link#freeMemory}forthecurrentnumberof *thosebytesactuallyusedbyliveobjects.*/intmaxMemory=Runtime.getRuntime().maxMemory());//应用程序最大可用内存/** *Returnsthenumberofbytestakenbytheheapatitscurrentsize.Theheapmayexpandor *contractovertime,asthenumberofliveobjectsincreasesordecreases.See *{@link#maxMemory}forthemaximumheapsize,and{@link#freeMemory}foranideaofhowmuch *theheapcouldcurrentlycontract.*/longtotalMemory=Runtime.getRuntime().totalMemory());//应用程序已获得内存/** *Returnsthenumberofbytescurrentlyavailableontheheapwithoutexpandingtheheap.See *{@link#totalMemory}fortheheap'scurrentsize.Whenthesebytesareexhausted,theheap *mayexpand.See{@link#maxMemory}forthatlimit.*/longfreeMemory=Runtime.getRuntime().freeMemory());//应用程序已获得内存中未使用内存 5)注意Cursor对象是否及时关闭 在程序中我们经常会进行查询数据库的操作,但时常会存在不小心使用Cursor之后没有及时关闭的情况。这些Cursor的泄露,反复多次出现的话会对内存管理产生很大的负面影响,我们需要谨记对Cursor对象的及时关闭。 4.4 内存使用策略优化 谨慎使用large heap 综合考虑设备内存阈值与其他因素设计合适的缓存大小 onLowMemory()/onTrimMemory(int) 资源文件需要选择合适的文件夹进行存放 Try catch某些大内存分配的操作 谨慎使用static对象 优化布局层次,减少内存消耗 谨慎使用多进程 谨慎使用依赖注入框架 使用ProGuard来剔除不需要的代码 谨慎使用第三方libraries 考虑不同的实现方式来优化内存占用 二、线程安全 1、下面的方法是线程安全的吗? 怎样使上述方法线程安全? 2、Java中的线程安全 怎样保持在多线程环境下的数据一致性,Java提供了多种方法实现: synchronized java.util.concurrent.atomic java.util.concurrent.locks thread safe collection(ConcurrentHashMap) volatile 2.1 synchronized JVM保证被synchronized关键字修饰的代码段在同一时间只能被一个线程访问,内部通过对对象或类加锁来实现的。当方法被synchronized修饰时,锁加在对象上;当方法同时为static时,锁加在类上。从性能的角度来讲,一般不建议直接将锁加在类上,这样会使得类的所有对象的该方法均为synchronized的。 从之前扫描的问题来看,在编写synchronized程序时主要有两点需要注意: synchronized需要创建基于对象或者类的锁,所以不能在构造器或者变量上加锁。 synchronized造成死锁。 1) 锁加在哪里? List<ResultPoint>currentPossible=possibleResultPoints; List<ResultPoint>currentLast=lastPossibleResultPoints;intframeLeft=frame.left;intframeTop=frame.top;if(currentPossible.isEmpty()){ lastPossibleResultPoints=null; }else{ possibleResultPoints=newArrayList<>(5); lastPossibleResultPoints=currentPossible; paint.setAlpha(CURRENT_POINT_OPACITY); paint.setColor(resultPointColor);synchronized(currentPossible){for(ResultPointpoint:currentPossible){ canvas.drawCircle(frameLeft+(int)(point.getX()*scaleX),frameTop+(int)(point.getY()*scaleY),POINT_SIZE, paint); } } } 上述方法中,possibleResultPoints的创建没有采用同步措施,需要使用Collections.synchronizedXxx。 List<MyType>list=Collections.synchronizedList(newArrayList(<MyType>)); ...synchronized(list){for(MyTypem:list){ foo(m); m.doSomething(); } } 一般比较推荐创建一个虚拟的对象专门用于获取锁。 //dummyobjectvariableforsynchronizationprivateObjectmutex=newObject(); ...//usingsynchronizedblocktoread,incrementandupdatecountvaluesynchronouslysynchronized(mutex){ count++; } PS:直接在方法上加synchronized可能DoS攻击喔,举个栗子: publicclassMyObject{//Locksontheobject'smonitor publicsynchronizedvoiddoSomething(){ //...} }//黑客的代码MyObjectmyObject=newMyObject();synchronized(myObject){while(true){//IndefinitelydelaymyObjectThread.sleep(Integer.MAX_VALUE); } } 黑客的代码获取了MyObject对象的锁,导致doSomething死锁,从而引发Denial of Service。 publicclassMyObject{//locksontheclassobject'smonitor publicstaticsynchronizedvoiddoSomething(){ //...} }//黑客的代码synchronized(MyObject.class){while(true){ Thread.sleep(Integer.MAX_VALUE);//IndefinitelydelayMyObject} } 2) 死锁。 publicclassThreadDeadlock{publicstaticvoidmain(String[]args)throwsInterruptedException{ Objectobj1=newObject(); Objectobj2=newObject(); Objectobj3=newObject(); Threadt1=newThread(newSyncThread(obj1,obj2),"t1"); Threadt2=newThread(newSyncThread(obj2,obj3),"t2"); Threadt3=newThread(newSyncThread(obj3,obj1),"t3"); t1.start(); Thread.sleep(5000); t2.start(); Thread.sleep(5000); t3.start(); } }classSyncThreadimplementsRunnable{privateObjectobj1;privateObjectobj2;publicSyncThread(Objecto1,Objecto2){this.obj1=o1;this.obj2=o2; } @Overridepublicvoidrun(){ Stringname=Thread.currentThread().getName(); System.out.println(name+"acquiringlockon"+obj1);synchronized(obj1){ System.out.println(name+"acquiredlockon"+obj1); work(); System.out.println(name+"acquiringlockon"+obj2);synchronized(obj2){ System.out.println(name+"acquiredlockon"+obj2); work(); } System.out.println(name+"releasedlockon"+obj2); } System.out.println(name+"releasedlockon"+obj1); System.out.println(name+"finishedexecution."); }privatevoidwork(){try{ Thread.sleep(30000); }catch(InterruptedExceptione){ e.printStackTrace(); } } } 本文转自xsster51CTO博客,原文链接:http://blog.51cto.com/12945177/1929765 ,如需转载请自行联系原作者

优秀的个人博客,低调大师

高危|Linux 内核 XFS reflink 本地提权漏洞修复指南

近日,OpenCloudOS社区安全 SIG 监测到 Linux 内核 XFS reflink子系统中存在本地提权漏洞(CVE-2026-64600,又名RefluXFS),该漏洞源于 xfs_reflink_fill_cow_hole() 和 xfs_reflink_fill_delalloc() 函数在ILOCK循环后未刷新数据分支映射。攻击者可通过在XFS reflink文件系统上利用FICLONE与O_DIRECT写入制造竞态条件,覆写 /etc/passwd 或SUID-root二进制文件实现本地提权至root。该漏洞PoC 及 EXP 均已公开,OpenCloudOS 8 与OpenCloudOS 9 均受影响。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册