• 首页
  • 被平台黑了取不了款怎么出黑
  • 网上赢钱被黑不给取款解决方法
  • 开通VIP发文章免审核
  • 联系我们

{{userData.name}}

个人中心
后台
{{item.count}}
{{textHint.loading}}
  • {{data.name}}({{data.count}}){{data.name}}
写文章
当前位置:首页-网上赢钱被黑不给取款解决方法-正文

第三方数据取不了 嵌入式开发中的防御性C语言编程

专业出黑 专业出黑 网上赢钱被黑不给取款解决方法10个月前008.70M0
文章浏览阅读536次。嵌入式产品的可靠性自然与硬件密不可分,但在硬件确定、并且没有第三方测试的前提下,使用防御性编程思想写出的代码,往往具有更高的稳定性。

嵌入式产品的可靠性自然与硬件密不可分,但在硬件确定、并且没有第三方测试的前提下,使用防御性编程思想写出的代码,往往具有更高的稳定性。

防御性编程首先需要认清C语言的种种缺陷和陷阱,C语言对于运行时的检查十分弱小,需要程序员谨慎的考虑代码,在必要的时候增加判断;防御性编程的另一个核心思想是假设代码运行在并不可靠的硬件上,外接干扰有可能会打乱程序执行顺序、更改RAM存储数据等等。

1 具有形参的函数,需判断传递来的实参是否合法

程序员可能无意识的传递了错误参数;外界的强干扰可能将传递的参数修改掉,或者使用随机参数意外的调用函数,因此在执行函数主体前,需要先确定实参是否合法。

2 仔细检查函数的返回值

对函数返回的错误码,要进行全面仔细处理,必要时做错误记录。

3 防止指针越界

如果动态计算一个地址时,要保证被计算的地址是合理的并指向某个有意义的地方。特别对于指向一个结构或数组的内部的指针,当指针增加或者改变后仍然指向同一个结构或数组。

4 防止数组越界

数组越界的问题前文已经讲述的很多了,由于C不会对数组进行有效的检测,因此必须在应用中显式的检测数组越界问题。下面的例子可用于中断接收通讯数据。

在使用一些库函数时,同样需要对边界进行检查,比如下面的(,0,len)函数把指指向的内存区的前len个字节用0填充,如果不注意len的长度,就会将数组之外的内存区清零:

5 数学算数运算 5**.1除法运算,只检测除数为零就可靠吗?**

除法运算前,检查除数是否为零几乎已经成为共识,但是仅检查除数是否为零就够了吗?

考虑两个整数相除,对于一个 long类型变量,它能表示的数值范围为:- ~+,如果让-/ -1,那么结果应该是+,但是这个结果已经超出了所能表示的范围了。所以,在这种情况下,除了要检测除数是否为零外,还要检测除法是否溢出。

 #include 
 signed long sl1,sl2,result;
 /*初始化sl1和sl2*/    
 if((sl2==0)||(sl1==LONG_MIN && sl2==-1))
 {
     //处理错误    
 }
 else   
 {
     result = sl1 / sl2;
 }

5**.2检测运算溢出**

整数的加减乘运算都有可能发生溢出,在讨论未定义行为时,给出过一个有符号整形加法溢出判断代码,这里再给出一个无符号整形加法溢出判断代码段:

#include     
unsigned int a,b,result;
/*初始化a,b*/
if(UINT_MAX-a<b)
 {
//处理溢出    
 }
else
 {
     result=a+b;
 }

嵌入式硬件一般没有浮点处理器,浮点数运算在嵌入式也比较少见并且溢出判断严重依赖C库支持,这里不讨论。

5.3检测移****位

在讨论未定义行为时,提到有符号数右移、移位的数量是负值或者大于操作数的位数都是未定义行为,也提到不对有符号数进行位操作,但要检测移位的数量是否大于操作数的位数。下面给出一个无符号整数左移检测代码段:

unsigned int ui1;
unsigned int ui2;
unsigned int uresult;
/*初始化ui1,ui2*/
if(ui2>=sizeof(unsigned int)*CHAR_BIT)
 {
//处理错误  
 }
else
 {
     uresult=ui1<<ui2;
 }

6 如果有硬件看门狗,则使用它

在其它一切措施都失效的情况下,看门狗可能是最后的防线。它的原理特别简单,但却能大大提高设备的可靠性。如果设备有硬件看门狗,一定要为它编写驱动程序。相关推荐:。

7****关键数据储存多个备份,取数据采用“表决法”

RAM中的数据在受到干扰情况下有可能被改变,对于系统关键数据应该进行保护。关键数据包括全局变量、静态变量以及需要保护的数据区域。备份数据与原数据不应该处于相邻位置,因此不应由编译器默认分配备份数据位置,而应该由程序员指定区域存储。相关文章:。

可以将RAM分为3个区域,第一个区域保存原码,第二个区域保存反码,第三个区域保存异或码,区域之间预留一定量的“空白”RAM作为隔离。可以使用编译器的“分散加载”机制将变量分别存储在这些区域。需要进行读取时,同时读出3份数据并进行表决,取至少有两个相同的那个值。

假如设备的RAM从开始,我需要在RAM的F内存储原码,在F内存储反码,在~内存储0xAA的异或码,编译器的分散加载可以设置为:

 LR_IROM1 0x00000000 0x00080000  {    ; load region size_region
   ER_IROM1 0x00000000 0x00080000  {  ; load address = execution address
    *.o (RESET, +First)
    *(InRoot$$Sections)
    .ANY (+RO)
   }
   RW_IRAM1 0x10000000 0x00008000  {  ;保存原码
    .ANY (+RW +ZI )
   }
   RW_IRAM3 0x10009000 0x00001000{    ;保存反码
    .ANY (MY_BK1)
   }
   RW_IRAM2 0x1000B000 0x00001000  {  ;保存异或码
    .ANY (MY_BK2)
   }
 }

如果一个关键变量需要多处备份,可以按照下面方式定义变量,将三个变量分别指定到三个不连续的RAM区中,并在定义时按照原码、反码、0xAA的异或码进行初始化。

 uint32  plc_pc=0;                                                       //原码  
 __attribute__((section("MY_BK1"))) uint32 plc_pc_not=~0x0;              //反码  
 __attribute__((section("MY_BK2"))) uint32 plc_pc_xor=0x0^0xAAAAAAAA;    //异或码

当需要写这个变量时,这三个位置都要更新;读取变量时,读取三个值做判断,取至少有两个相同的那个值。

为什么选取异或码而不是补码?这是因为MDK的整数是按照补码存储的,正数的补码与原码相同,在这种情况下,原码和补码是一致的,不但起不到冗余作用,反而对可靠性有害。比如存储的一个非零整数区因为干扰,RAM都被清零,由于原码和补码一致,按照3取2的“表决法”,会将干扰值0当做正确的数据。

8 对非易失性存储器进行备份存****储

非易失性存储器包括但不限于Flash、、铁电。仅仅将写入非易失性存储器中的数据再读出校验是不够的。强干扰情况下可能导致非易失性存储器内的数据错误,在写非易失性存储器的期间系统掉电将导致数据丢失,因干扰导致程序跑飞到写非易失性存储器函数中,将导致数据存储紊乱。相关文章:。

一种可靠的办法是将非易失性存储器分成多个区,每个数据都将按照不同的形式写入到这些分区中,需要进行读取时,同时读出多份数据并进行表决,取相同数目较多的那个值。

9 软件****锁

对于初始化序列或者有一定先后顺序的函数调用,为了保证调用顺序或者确保每个函数都被调用,我们可以使用环环相扣,实质上这也是一种软件锁。此外对于一些安全关键代码语句(是语句,而不是函数),可以给它们设置软件锁,只有持有特定钥匙的,才可以访问这些关键代码。也可以通俗的理解为,关键安全代码不能按照单一条件执行,要额外的多设置一个标志。

比如,向Flash写一个数据,我们会判断数据是否合法、写入的地址是否合法,计算要写入的扇区。之后调用写Flash子程序,在这个子程序中,判断扇区地址是否合法、数据长度是否合法,之后就要将数据写入Flash。

由于写Flash语句是安全关键代码,所以程序给这些语句上锁:必须具有正确的钥匙才可以写Flash。这样即使是程序跑飞到写Flash子程序,也能大大降低误写的风险。

 /***************************************************************
 * 名称:RamToFlash() 
 * 功能:复制RAM的数据到FLASH,命令代码51。
 * 入口参数:dst        目标地址,即FLASH起始地址。以512字节为分界 
 *           src        源地址,即RAM地址。地址必须字对齐 
 *           no         复制字节个数,为512/1024/4096/8192 
 *           ProgStart  软件锁标志    
 * 出口参数:IAP返回值(paramout缓冲区) CMD_SUCCESS,SRC_ADDR_ERROR,DST_ADDR_ERROR, 
 SRC_ADDR_NOT_MAPPED,DST_ADDR_NOT_MAPPED,COUNT_ERROR,BUSY,未选择扇区 
 ****************************************************************/  
 void  RamToFlash(uint32 dst, uint32 src, uint32 no,uint8 ProgStart)  
 {
     PLC_ASSERT("Sector number",(dst>=0x00040000)&&(dst<=0x0007FFFF));
     PLC_ASSERT("Copy bytes number is 512",(no==512));
     PLC_ASSERT("ProgStart==0xA5",(ProgStart==0xA5));
     paramin[0] = IAP_RAMTOFLASH;       // 设置命令字  
     paramin[1] = dst;                  // 设置参数  
     paramin[2] = src;
     paramin[3] = no;
     paramin[4] = Fcclk/1000;
     if(ProgStart==0xA5)                //只有软件锁标志正确时,才执行关键代码  
     {
         iap_entry(paramin, paramout);  // 调用IAP服务程序                 
         ProgStart=0;
     }
     else  
     {
         paramout[0]=PROG_UNSTART;
     }
 }

该程序段是编程内部Flash,其中调用IAP程序的函数(, )是关键安全代码,所以在执行该代码前,先判断一个特定设置的安全锁标志,只有这个标志符合设定值,才会执行编程Flash操作。如果因为意外程序跑飞到该函数,由于标志不正确,是不会对Flash进行编程的。

1****0 通信

通讯线上的数据误码相对严重,通讯线越长,所处的环境越恶劣,误码会越严重。抛开硬件和环境的作用,我们的软件应能识别错误的通讯数据。对此有一些应用措施:

1****1 开关量输入的检测、确认

开关量容易受到尖脉冲干扰,如果不进行滤除,可能会造成误动作。一般情况下,需要对开关量输入信号进行多次采样,并进行逻辑判断直到确认信号无误为止。

1****2 开关量输出

开关信号简单的一次输出是不安全的,干扰信号可能会翻转开关量输出的状态。采取重复刷新输出可以有效防止电平的翻转。

1****3 初始化信息的保存和恢复

微处理器的寄存器值也可能会因外界干扰而改变,外设初始化值需要在寄存器中长期保存,最容易被破坏。由于Flash中的数据相对不易被破坏,可以将初始化信息预先写入Flash,待程序空闲时比较与初始化相关的寄存器值是否被更改,如果发现非法更改则使用Flash中的值进行恢复。

公司目前使用的4.3寸LCD显示屏抗干扰能力一般。如果显示屏与控制器之间的排线距离过长或者对使用该显示屏的设备打静电或者脉冲群,显示屏有可能会花屏或者白屏。

对此,我们可以将初始化显示屏的数据保存在Flash中,程序运行后,每隔一段时间从显示屏的寄存器读出当前值和Flash存储的值相比较,如果发现两者不同,则重新初始化显示屏。下面给出校验源码,仅供参考。

定义数据结构:

定义const修饰的结构体变量,存储LCD部分寄存器的初始值,这个初始值跟具体的应用初始化有关,不一定是表中的数据,通常情况下,这个结构体变量被存储到Flash中。

 /*LCD部分寄存器设置值列表*/  
 lcd_redu_list_struct const lcd_redu_list_str[]=
 {
   {SSD1963_Get_Address_Mode,{0x20}                                   ,1}, /*1*/ 
   {SSD1963_Get_Pll_Mn      ,{0x3b,0x02,0x04}                         ,3}, /*2*/ 
   {SSD1963_Get_Pll_Status  ,{0x04}                                   ,1}, /*3*/ 
   {SSD1963_Get_Lcd_Mode    ,{0x24,0x20,0x01,0xdf,0x01,0x0f,0x00}     ,7}, /*4*/ 
   {SSD1963_Get_Hori_Period ,{0x02,0x0c,0x00,0x2a,0x07,0x00,0x00,0x00},8}, /*5*/ 
   {SSD1963_Get_Vert_Period ,{0x01,0x1d,0x00,0x0b,0x09,0x00,0x00}     ,7}, /*6*/ 
   {SSD1963_Get_Power_Mode  ,{0x1c}                                   ,1}, /*7*/ 
   {SSD1963_Get_Display_Mode,{0x03}                                   ,1}, /*8*/ 
   {SSD1963_Get_Gpio_Conf   ,{0x0F,0x01}                              ,2}, /*9*/ 
   {SSD1963_Get_Lshift_Freq ,{0x00,0xb8}                              ,2}, /*10*/
 };

实现函数如下所示,函数会遍历结构体变量中的每一个命令,以及每一个命令下的初始值,如果有一个不正确,则跳出循环,执行重新初始化和恢复措施。这个函数中的宏是我自己的调试函数,使用串口打印调试信息,在接下来的第五部分将详细叙述。

通过这个函数,我可以长时间监控显示屏的哪些命令、哪些位容易被干扰。程序里使用了一个被妖魔化的关键字:goto。大多数C语言书籍对goto关键字谈之色变,但你应该有自己的判断。在函数内部跳出多重循环,除了goto关键字,又有哪种方法能如此简洁高效!

 /** 
 * lcd 显示冗余 
 * 每隔一段时间调用该程序一次 
 */  
 void lcd_redu(void)  
 {
     uint8_t  tmp[8];
     uint32_t i,j;
     uint32_t lcd_init_flag;
     lcd_init_flag =0;
     for(i=0;i<sizeof(lcd_redu_list_str)/sizeof(lcd_redu_list_str[0]);i+)
     {
LCD_SendCommand(lcd_redu_list_str[i].lcd_command);
uyDelay(10);
for(j=0;j<lcd_redu_list_str[i].lcd_value_num;j++)
         {
tmp[j]=LCD_ReadData();
if(tmp[j]!=lcd_redu_list_str[i].lcd_get_value[j])
             {
lcd_init_flag=0x55;
MY_DEBUGF(MENU_DEBUG,("读lcd寄存器值与预期不符,命令为:0x%x,第%d个参数,
             该参数正确值为:0x%x,实际读出值为:0x%xn",lcd_redu_list_str[i].lcd_command,j+1,
lcd_redu_list_str[i].lcd_get_value[j],tmp[j]));
goto handle_lcd_init;
             }
         }
     }
handle_lcd_init:
if(lcd_init_flag==0x55)
     {
         //重新初始化LCD
         //一些必要的恢复措施  
     }
 }

1****4 陷阱

对于8051内核单片机,由于没有相应的硬件支持,可以用纯软件设置软件陷阱,用来拦截一些程序跑飞。对于ARM7或者-M系列单片机,硬件已经内建了多种异常,软件需要根据硬件异常来编写陷阱程序,用来快速定位甚至恢复错误。

1****5 阻塞处理

有时候程序员会使用while(!flag);语句阻塞在此等待标志flag改变,比如串口发送时用来等待一字节数据发送完成。这样的代码时存在风险的,如果因为某些原因标志位一直不改变则会造成系统死机。

一个良好冗余的程序是设置一个超时定时器,超过一定时间后,强制程序退出while循环。

2003年8月11日发生的W32..Worm蠕虫事件导致全球经济损失高达5亿美元,这个漏洞是利用了分布式组件对象模型的远程过程调用接口中的一个逻辑缺陷:在调用()函数时,循环只设置了一个不充分的结束条件。

原代码简化如下所示:

微软发布的安全补丁MS03-026解决了这个问题,为()函数设置了充分终止条件。一个解决代码简化如下所示(并非微软补丁代码):

 HRESULT GetMachineName( WCHAR *pwszPath,  
 WCHARwszMachineName[MAX_COMPUTTERNAME_LENGTH_FQDN+1])
 {
        WCHAR *pwszServerName = wszMachineName;
        WCHAR *pwszTemp = pwszPath + 2;
        WCHAR *end_addr = pwszServerName +MAX_COMPUTTERNAME_LENGTH_FQDN;
        while ((*pwszTemp != L’\’ ) && (*pwszTemp != L’0’)&& (pwszServerName<end_addr))  /*充分终止条件*/  
              *pwszServerName++= *pwszTemp++;
        /*… */  
 }

相关文章

  • 信秒贷有额度无法提款 宁波银行容易贷提款失败怎么办

    信秒贷有额度无法提款 宁波银行容易贷提款失败怎么办

    宁波银行容易贷提款失败怎么办宁波银行直接贷额度怎么不循环了宁波银行的直接贷是循环额度,如果不能循环了,很可能是以下几点原因:一、授信期限到了。虽…
    专业出黑 专业出黑 网上赢钱被黑不给取款解决方法1年前0011M0
  • 平台系统维护提不了款怎么办 网上平台系统维护不给出款怎么办

    平台系统维护提不了款怎么办 网上平台系统维护不给出款怎么办

    那么给大家解释一下什么是系统维护,一般为了清除系统运行中发生的故障和错误,才对系统进行软,硬件进行优化以及改善更新,满足新提出的要求,也要对原系…
    专业出黑 专业出黑 网上赢钱被黑不给取款解决方法1年前0010.90M0
  • 网络被黑不能提款 揭秘虚假网络贷款诈骗,切勿“越贷越穷”!

    网络被黑不能提款 揭秘虚假网络贷款诈骗,切勿“越贷越穷”!

    当你急需用钱时,有人给你打电话、发短信,声称可以提供无抵押、利率低、快速到账的贷款,只需点击链接,下载APP即可。切勿轻信,当心遭遇虚假网络贷款…
    专业出黑 专业出黑 网上赢钱被黑不给取款解决方法7个月前009M0
  • 网上赢钱被黑不给提款怎么 赢了网的模式对律师个人和律师行业来说有没有价值?

    网上赢钱被黑不给提款怎么 赢了网的模式对律师个人和律师行业来说有没有价值?

    希望有出现这朋友如果你正好需要解决蛧投被黑的问题,不知道怎么去解决,现在有很好的解决办法可以帮助你,只要账号能登入账号正常转换就可以,可以解决包…
    专业出黑 专业出黑 网上赢钱被黑不给取款解决方法1年前0011.50M0
  • 网站上赢了不给出款怎么办 网络网站赢了客服不给出款怎么办(律师分析)

    网站上赢了不给出款怎么办 网络网站赢了客服不给出款怎么办(律师分析)

    律师分析:在网络网站赢了客服不给出款怎么办在网络时代,越来越多的人选择在网上进行各种形式的娱乐和投资,其中包括在网络网站上进行D博或者投资交易。…
    专业出黑 专业出黑 网上赢钱被黑不给取款解决方法1年前0011.30M0
  • 黑平台不给出款怎么办 揭秘网上赢钱被黑不给出款的骗局

    黑平台不给出款怎么办 揭秘网上赢钱被黑不给出款的骗局

    网上赢钱被黑不给出款揭秘网上赢钱被黑不给出款的骗局在信息时代,互联网给我们带来了便利和更多的机遇。其中,网上赢钱成为了许多人追逐财富的途径。然…
    专业出黑 专业出黑 网上赢钱被黑不给取款解决方法9个月前009.30M0
  • 网上平台赢钱被黑不给提款怎么办 网上平台赢钱被黑人账号涉嫌套利不给提款

    网上平台赢钱被黑不给提款怎么办 网上平台赢钱被黑人账号涉嫌套利不给提款

    1、写在前面边可以告诉你解析方法和技巧,以帮助遭遇窘境的朋友。小编将《网上平台赢钱被黑人账号涉嫌套利不给提款》的相关内容,分享给你们,本文由热心…
    专业出黑 专业出黑 网上赢钱被黑不给取款解决方法7个月前008.90M0
  • 网上赢钱被黑提款失败怎么办 网上被黑提款失败怎么办 网上平台赢了被黑审核维护提款失败怎么办?最新解决办法

    网上赢钱被黑提款失败怎么办 网上被黑提款失败怎么办 网上平台赢了被黑审核维护提款失败怎么办?最新解决办法

    网上平台赢了被黑审核维护提款失败怎么办?网上在网上被黑不给提款该怎么办被黑了件事就是让自己冷静下来,保持心理平静,千万不要和客服起任何冲突,因为…
    专业出黑 专业出黑 网上赢钱被黑不给取款解决方法11个月前0014M0
  • 黑平台炒股被骗怎么办 投资200万元几天盈利翻倍?六旬老汉炒股被骗288万元

    黑平台炒股被骗怎么办 投资200万元几天盈利翻倍?六旬老汉炒股被骗288万元

    “炒股利润大、大师荐股、只赚不赔”,听起来很诱人。这不,江西赣州定南县市民曾大爷深受诱惑,结果被骗288万元。江西定南警方接警后,辗转河南、广东…
    专业出黑 专业出黑 网上赢钱被黑不给取款解决方法7个月前008.30M0
  • 被平台黑专门帮人出款 帮助转账上百万元,情节轻微,不起诉

    被平台黑专门帮人出款 帮助转账上百万元,情节轻微,不起诉

    乾县人民检察院不起诉决定书乾县检刑不诉〔2023〕22号被不起诉人康芳妮,女,1982年**月**日出生,身份证号码6104261982****…
    专业出黑 专业出黑 网上赢钱被黑不给取款解决方法1年前0011.10M0
  • 第三方注取不了现 花都区民政局关于委托第三方开展2024年度花都区居家社区养老服务评估巡查项目比选公告

    第三方注取不了现 花都区民政局关于委托第三方开展2024年度花都区居家社区养老服务评估巡查项目比选公告

    报名及递交资料截止时间:发布之日起至2024年1月24日18时止;…
    专业出黑 专业出黑 网上赢钱被黑不给取款解决方法1年前009.70M0
  • 被平台黑了不给提款怎么办 提款被黑怎么办

    被平台黑了不给提款怎么办 提款被黑怎么办

    1、开头语“一夜暴富”那是梦进入整理的四大注意事项,每一个都很重要一夜暴富,这对很多人来说都极具诱惑力,因为一夜暴富意味着可以在极短的时间内获得…
    专业出黑 专业出黑 网上赢钱被黑不给取款解决方法9个月前009.90M0

最新文章

  • 有效流水不足不给提款怎么办 系统异常暂时维护流水不足一直不提不了怎么回事?
  • 平台赢了不给提款怎么办 网上赢钱被黑不给提款怎么办可以拿回
  • 平台赢了不给提款怎么办 揭秘网上赢钱被黑不给提款的陷阱
  • 网上赢钱提不了现怎么办 平台说账号异常不给提现怎么办
  • 网上赢钱提不了现怎么办 网上赢钱显示通道目前维护:我们要如何挽回_小莫出品
  • 网上赢钱提不了现怎么办 2、在网上平台赢钱风控审核中提现失败啥破解方法?
  • 网上赢钱提不了款怎么办 网上平台升级成VIP出款不能到账
  • 网上赢钱提不了款怎么办 揭秘账户异常风控审核一直不给出款
  • 审核过的平台 视频号加热审核不通过怎么申诉?全套流程sop已整理出来!
  • 出款审核无法取款 在网站银行系统维护不能出款怎么办?如何是好
  • 审核过的平台 教育部办公厅关于印发《国家智慧教育公共服务平台接入管理规范(试行)》的通知
  • 出款审核无法取款 网上网站被黑出款通道维护拒绝取款有办法解决吗
  • 通道维护不给提款怎么办 账户异常出款退回,取款通道维护了找谁
  • 365风控审核不给提款怎么办 365最多提款多少
  • 网上平台被黑不给提款怎么办 网上被黑不给提款怎么办Q--这个平台要小心
  • 网上平台被黑不给提款怎么办 网上被黑提款不了-可以怎么做
  • 取款通道维护不给取款怎么解决 银行取款新规:今年已开始执行,存款超过10万一定要注意
  • 赢了提不了现 如何解决软件提现无法提取的问题
  • 平台流水不够不给提款 ‘离谱!’《加幂科技软件app》流水不够不让取款皆套路,不能提现已追回

没有相关内容

Copyright © 2020-至今 被平台黑了取不了款怎么出黑•网上赢钱被黑不给取款解决方法  陕ICP备2023010157号
42 次查询在 0.868 秒, 使用 42.01MB 内存