Solution:在SM30保存时检查数据

1/7 问题描述

在SM30保存时检查数据,你可能会直接修改生成的屏幕,比如Field后面写个Module xx ON REQUEST,或者在MODULE LISTE_AFTER_LOOP.前写一个自己的MODULE,执行你的检查代码。但:

1.当SM30维护器重新生成的时候,屏幕的逻辑流都会重建,导致我们修改的逻辑流都没了;

2.我们在列表屏点退出,系统会提示“是否保存数据”,如果点“是”,数据可能还保存上,绕过了我们的检查代码。

2/7 解决方案

更合理的做法是,利用SM30提供的事件出口如果你用过事件出口,也不要着急退出,下面可能有你没用过的知识)。如下:

f954214fce7f5be4896ebb98cb3173cd.png

然后在弹出的屏幕中,选择事件01,并创建一个检查的FORM,如:FRM_CHECK。

0666097915e9d3ec06ec5ec3a1829dd7.png

之后,点击“编辑器”列的代码编辑按钮,系统会提示你创建一个INCLUDE程序来包括这个FORM。

3/7 新的问题

之后,写个测试代码如下:

FORM frm_check.
  MESSAGE '错误' TYPE 'E'.
ENDFORM.

激活所有对象,编辑一下数据,点保存,测试一下效果。结果意外发生了……如下图:

c21b1cc695419910b5323cb6f4d50414.png

虽然系统报了错误,但从SM30的列表屏幕中退出来了,我们更希望是能在列表屏提示错误

4/7 问题分析

1.系统退回到了SM30的初始界面,一定是执行了LEAVE命令,保存前输入/H,然后保存,再按命令打断点,如下:

deeb1135bceb91331a27bd396c101d73.png

然后,继续执行。果然系统执行到了LEAVE代码处,如下:

3d85f6a26ec7ef958d97f852b24a11ac.png

2.可为什么我们保存成功的时候,系统并没有停留在SM30的初始界面,而是在列表屏呢?这说明,系统执行了LEAVE后,又执行了类似CALL SCREEN之类的命令,跳转到了列表屏。

于是再加一个命令断点:CALL SCREEN,重新执行测试,发现系统果然又执行了CALL SCREEN的命令,如下:

22bd7773ec3d3d7b30d5d64832678cb4.png

3.那我们怎么才能让系统既报错误,又能重新执行这个CALL SCREEN的命令呢?

之前我们报的E消息,程序执行到这里就停止了。程序停止保存动作是我们想要的结果,但这个E类型消息满足不了我们的要求,所以我们应该考虑RAISE异常

于是我们看看程序堆栈中是不是有函数调用,函数中是不是有EXCEPTION参数,如下:

a3bd3c2930c32e323af40677db39c01c.png

5/7 最终方案

通过上面的程序堆栈可以看出,我们自己写的检查FORM的代码,是在这个FUNCTION中调用的,而且这个FUNCTION提供了异常saving_correction_failed的异常。所以我们改一下检查的代码:

FORM frm_check.
  MESSAGE '错误' TYPE 'S' DISPLAY LIKE 'E'.
  RAISE saving_correction_failed.
ENDFORM.

再重新执行测试一下,果然没有问题了,错误消息完美的在列表屏中显示出来了:

f3435c933ed048b1337921ebc3bd056b.png

6/7 更多知识

SM30维护器函数有两个比较重要的公共内表,分别是EXTRACTTOTAL

EXTRACT指的是当前TableControl里的数据。比如你点新条目时,输入了两行新数据,那么EXTRACT就只有两行。所以进行事件增强前,一定要想好是要用哪个内表。

TOTAL指的是所有数据,包括删除还未保存的行项目。

循环EXTRACT的时候,<XACT> <VIM_EXTRACT_STRUC>会发生变化;

循环TOTAL的时候,<ACTION> <VIM_TOTAL_STRUC>会变化。

其中<XACT>和<ACTION>代表的是循环到的行的操作状态(比如D代表删除),而另外两个则是工作区。

使用方法:

DATA: ls_sl01 TYPE ysl01. "YSL01是表名
  LOOP AT total.
    MOVE-CORRESPONDING <vim_total_struc> TO ls_sl01.
  ENDLOOP.

7/7 总结

我的文章基本不会只罗列解决方案,而是会把解决问题的思路讲清楚。毕竟会一个知识点那只是会了,而会了方法掌握了策略才是得了更高一级的

我的SE38插件工具箱——视频介绍:

https://www.bilibili.com/video/BV1hP4y1N7Qz/

联系286503700获取

ABAP文章汇总:

https://mp.weixin.qq.com/s/djmMeM0qfDxPPwxbjuJABA

Excel文章汇总:

https://mp.weixin.qq.com/s/NwJ0SzIrn9hVmaCMo-UYyA

网盘永久链接:

https://mp.weixin.qq.com/s/f_WwKZdwM-vPEstTjjz_eQ

关注公众号,点下方菜单打开上面的链接,更方便哦。

笔者微信:286503700(QQ同号)

如果喜欢,谢谢转发。

Line 18: Char 11: AddressSanitizer:DEADLYSIGNAL ================================================================= ==22==ERROR: AddressSanitizer: stack-overflow on address 0x7ffe84332fd8 (pc 0x5630b9a1c8cf bp 0x7ffe84333030 sp 0x7ffe84332fe0 T0) #0 0x5630b9a1c8cf in operator+= /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/basic_string.h:1399:8 #1 0x5630b9a1c8cf in Solution::DFS(int, int) solution.cpp:18:11 #2 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #3 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #4 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #5 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #6 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #7 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #8 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #9 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #10 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #11 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #12 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #13 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #14 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #15 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #16 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #17 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #18 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #19 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #20 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #21 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #22 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #23 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #24 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #25 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #26 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #27 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #28 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #29 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #30 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #31 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #32 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #33 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #34 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #35 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #36 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #37 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #38 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #39 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #40 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #41 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #42 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #43 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #44 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #45 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #46 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #47 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #48 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #49 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #50 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #51 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #52 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #53 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #54 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #55 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #56 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #57 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #58 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #59 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #60 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #61 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #62 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #63 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #64 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #65 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #66 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #67 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #68 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #69 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #70 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #71 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #72 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #73 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #74 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #75 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #76 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #77 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #78 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #79 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #80 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #81 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #82 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #83 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #84 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #85 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #86 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #87 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #88 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #89 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #90 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #91 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #92 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #93 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #94 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #95 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #96 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #97 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #98 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #99 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #100 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #101 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #102 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #103 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #104 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #105 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #106 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #107 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #108 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #109 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #110 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #111 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #112 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #113 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #114 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #115 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #116 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #117 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #118 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #119 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #120 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #121 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #122 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #123 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #124 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #125 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #126 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #127 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #128 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #129 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #130 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #131 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #132 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #133 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #134 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #135 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #136 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #137 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #138 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #139 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #140 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #141 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #142 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #143 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #144 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #145 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #146 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #147 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #148 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #149 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #150 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #151 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #152 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #153 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #154 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #155 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #156 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #157 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #158 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #159 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #160 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #161 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #162 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #163 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #164 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #165 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #166 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #167 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #168 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #169 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #170 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #171 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #172 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #173 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #174 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #175 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #176 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #177 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #178 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #179 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #180 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #181 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #182 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #183 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #184 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #185 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #186 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #187 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #188 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #189 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #190 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #191 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #192 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #193 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #194 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #195 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #196 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #197 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #198 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #199 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #200 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #201 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #202 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #203 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #204 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #205 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #206 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #207 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #208 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #209 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #210 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #211 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #212 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #213 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #214 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #215 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #216 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #217 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #218 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #219 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #220 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #221 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #222 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #223 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #224 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #225 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #226 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #227 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #228 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #229 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #230 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #231 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #232 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #233 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #234 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #235 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #236 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #237 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #238 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #239 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #240 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #241 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #242 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #243 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #244 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #245 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #246 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 #247 0x5630b9a1c8e8 in Solution::DFS(int, int) solution.cpp:18:7 SUMMARY: AddressSanitizer: stack-overflow solution.cpp:18:11 in Solution::DFS(int, int) ==22==ABORTING
最新发布
08-15
### AddressSanitizer检测到堆栈溢出错误的定位与解决 当AddressSanitizer报告`stack-overflow`错误发生在`Solution::DFS`函数的第18行时,这表明程序在执行该函数时触发了堆栈溢出。堆栈溢出通常由以下几种情况引起: - **无限递归**:递归调用没有正确的终止条件,导致调用栈不断增长,最终超出系统限制。 - **局部变量过大**:在函数中声明了非常大的局部变量(如大型数组),这些变量存储在堆栈上,可能导致堆栈空间耗尽。 - **深度递归调用**:即使递归是有限的,但如果递归深度非常大,也可能导致堆栈溢出。 在`Solution::DFS`函数中,堆栈溢出可能与递归逻辑的设计有关。例如,如果DFS没有正确设置终止条件或访问标记机制失效,可能导致无限递归[^2]。此外,如果DFS函数中使用了较大的局部变量(如大数组、复杂对象等),也可能导致堆栈空间不足。 #### 示例代码分析 假设`Solution::DFS`函数的实现如下: ```cpp void Solution::DFS(int node) { visited[node] = true; for (int neighbor : adj[node]) { if (!visited[neighbor]) { DFS(neighbor); } } } ``` 该函数使用递归方式实现深度优先搜索。如果图的结构存在环或者访问标记机制未正确设置,可能导致无限递归并最终触发堆栈溢出错误[^2]。 #### 修复建议 1. **检查递归终止条件**:确保DFS函数具有明确的终止条件,避免无限递归。例如,确保所有节点在访问后都被正确标记为已访问。 2. **优化递归实现**:将递归实现改为迭代实现,使用显式栈(如`std::stack`)来模拟递归过程,从而避免堆栈溢出。 ```cpp void Solution::DFS(int start) { std::stack<int> stack; stack.push(start); visited[start] = true; while (!stack.empty()) { int node = stack.top(); stack.pop(); for (int neighbor : adj[node]) { if (!visited[neighbor]) { visited[neighbor] = true; stack.push(neighbor); } } } } ``` 3. **减少局部变量大小**:如果函数中使用了较大的局部变量,考虑将其改为全局变量或动态分配在堆上。 4. **增加堆栈大小**:在某些系统中,可以通过调整编译器选项或操作系统设置来增加程序的默认堆栈大小。例如,在Linux中可以使用`ulimit -s`命令调整堆栈大小。 #### 额外检查 - 使用调试工具(如GDB)查看调用栈的深度,确认是否由于递归过深导致堆栈溢出。 - 检查是否存在循环依赖或环状结构,确保DFS能够正确终止。 - 使用静态分析工具(如Clang Static Analyzer)检测潜在的递归问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值