JVM crash in ig9icd32.dll

My app is crashing with this report:

# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x614e7fe9, pid=1548, tid=0x000050d4
#
# JRE version: Java(TM) SE Runtime Environment (8.0_351-b10) (build 1.8.0_351-b10)
# Java VM: Java HotSpot(TM) Client VM (25.351-b10 mixed mode windows-x86 )
# Problematic frame:
# C  [ig9icd32.dll+0x4b7fe9]

This is repeatable. It happens every time I run my app.

From what I can gather from this forum and the Internet, this seems to be something in the Intel graphics driver.

I checked Windows Update and my laptop is up to date. I am running Windows 11.

Is it useful for me to pare down my code to a minimal test case to report somewhere? Or, is this one of those things which will take a bunch of time and reach no resolution?

This is not something jme related, however you could send the full stack, one may know the issue from the stack that calls the problematic frame, it may be just a matter of broken or corrupted drivers in the first place, in which case uninstalling and reinstalling may work.

Here is the full stack:

Stack: [0x18190000,0x181e0000],  sp=0x181de9b4,  free space=314k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [ig9icd32.dll+0x4b7fe9]
C  [ig9icd32.dll+0x513738]
C  [ig9icd32.dll+0x516876]
C  [ig9icd32.dll+0x57989b]
C  [ig9icd32.dll+0x5798e9]
C  [ig9icd32.dll+0x4b46f8]
C  [ig9icd32.dll+0x7868b4]
C  [ig9icd32.dll+0x886cc8]
C  [ig9icd32.dll+0x5781fb]
C  [ig9icd32.dll+0x5ddbde]
C  [ig9icd32.dll+0x5dedd5]
C  [ig9icd32.dll+0x843354]
C  [lwjgl_opengl.dll+0xdd61]
J 2814 C1 com.jme3.renderer.lwjgl.LwjglGL.glBufferData(ILjava/nio/ByteBuffer;I)V (11 bytes) @ 0x02e01518 [0x02e01490+0x88]
J 2348 C1 com.jme3.renderer.opengl.GLRenderer.updateBufferData(Lcom/jme3/scene/VertexBuffer;)V (312 bytes) @ 0x02d7c01c [0x02d7bda0+0x27c]
J 2196 C1 com.jme3.renderer.opengl.GLRenderer.setVertexAttrib(Lcom/jme3/scene/VertexBuffer;Lcom/jme3/scene/VertexBuffer;)V (621 bytes) @ 0x02d426b0 [0x02d423d0+0x2e0]
J 2270 C1 com.jme3.renderer.opengl.GLRenderer.renderMeshDefault(Lcom/jme3/scene/Mesh;II[Lcom/jme3/scene/VertexBuffer;)V (242 bytes) @ 0x02d65544 [0x02d65330+0x214]
J 2820 C1 com.jme3.renderer.opengl.GLRenderer.renderMesh(Lcom/jme3/scene/Mesh;II[Lcom/jme3/scene/VertexBuffer;)V (149 bytes) @ 0x02e050ac [0x02e04f00+0x1ac]
J 2790 C1 com.jme3.material.logic.DefaultTechniqueDefLogic.renderMeshFromGeometry(Lcom/jme3/renderer/Renderer;Lcom/jme3/scene/Geometry;)V (64 bytes) @ 0x02dfd270 [0x02dfd180+0xf0]
J 2762 C1 com.jme3.material.Material.render(Lcom/jme3/scene/Geometry;Lcom/jme3/light/LightList;Lcom/jme3/renderer/RenderManager;)V (130 bytes) @ 0x02df88d0 [0x02df8710+0x1c0]
J 2754 C1 com.jme3.renderer.RenderManager.renderGeometry(Lcom/jme3/scene/Geometry;)V (241 bytes) @ 0x02df58b0 [0x02df5640+0x270]
J 2827 C1 com.jme3.renderer.queue.RenderQueue.renderGeometryList(Lcom/jme3/renderer/queue/GeometryList;Lcom/jme3/renderer/RenderManager;Lcom/jme3/renderer/Camera;Z)V (77 bytes) @ 0x02e0bff0 [0x02e0bf80+0x70]
j  com.jme3.renderer.queue.RenderQueue.renderQueue(Lcom/jme3/renderer/queue/RenderQueue$Bucket;Lcom/jme3/renderer/RenderManager;Lcom/jme3/renderer/Camera;Z)V+68
j  com.jme3.renderer.RenderManager.renderViewPortQueues(Lcom/jme3/renderer/ViewPort;Z)V+45
j  com.jme3.renderer.RenderManager.flushQueue(Lcom/jme3/renderer/ViewPort;)V+3
j  com.jme3.renderer.RenderManager.renderViewPort(Lcom/jme3/renderer/ViewPort;F)V+457
j  com.jme3.renderer.RenderManager.render(FZ)V+149
j  com.jme3.app.SimpleApplication.update()V+197
j  com.jme3.system.lwjgl.LwjglWindow.runLoop()V+131
j  com.jme3.system.lwjgl.LwjglWindow.run()V+51
j  java.lang.Thread.run()V+11
v  ~StubRoutines::call_stub
V  [jvm.dll+0x166894]
V  [jvm.dll+0x2377ab]
V  [jvm.dll+0x167047]
V  [jvm.dll+0x166f86]
V  [jvm.dll+0x101aab]
V  [jvm.dll+0x18b064]
V  [jvm.dll+0x1d04bb]
C  [ucrtbase.dll+0x459d3]
C  [KERNEL32.DLL+0x17d69]
C  [ntdll.dll+0x6b74b]
C  [ntdll.dll+0x6b6cf]
C  0x00000000

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
J 2332  org.lwjgl.opengl.GL15C.nglBufferData(IJJI)V (0 bytes) @ 0x02d78f7d [0x02d78f20+0x5d]
J 2814 C1 com.jme3.renderer.lwjgl.LwjglGL.glBufferData(ILjava/nio/ByteBuffer;I)V (11 bytes) @ 0x02e01518 [0x02e01490+0x88]
J 2348 C1 com.jme3.renderer.opengl.GLRenderer.updateBufferData(Lcom/jme3/scene/VertexBuffer;)V (312 bytes) @ 0x02d7c01c [0x02d7bda0+0x27c]
J 2196 C1 com.jme3.renderer.opengl.GLRenderer.setVertexAttrib(Lcom/jme3/scene/VertexBuffer;Lcom/jme3/scene/VertexBuffer;)V (621 bytes) @ 0x02d426b0 [0x02d423d0+0x2e0]
J 2270 C1 com.jme3.renderer.opengl.GLRenderer.renderMeshDefault(Lcom/jme3/scene/Mesh;II[Lcom/jme3/scene/VertexBuffer;)V (242 bytes) @ 0x02d65544 [0x02d65330+0x214]
J 2820 C1 com.jme3.renderer.opengl.GLRenderer.renderMesh(Lcom/jme3/scene/Mesh;II[Lcom/jme3/scene/VertexBuffer;)V (149 bytes) @ 0x02e050ac [0x02e04f00+0x1ac]
J 2790 C1 com.jme3.material.logic.DefaultTechniqueDefLogic.renderMeshFromGeometry(Lcom/jme3/renderer/Renderer;Lcom/jme3/scene/Geometry;)V (64 bytes) @ 0x02dfd270 [0x02dfd180+0xf0]
J 2762 C1 com.jme3.material.Material.render(Lcom/jme3/scene/Geometry;Lcom/jme3/light/LightList;Lcom/jme3/renderer/RenderManager;)V (130 bytes) @ 0x02df88d0 [0x02df8710+0x1c0]
J 2754 C1 com.jme3.renderer.RenderManager.renderGeometry(Lcom/jme3/scene/Geometry;)V (241 bytes) @ 0x02df58b0 [0x02df5640+0x270]
J 2827 C1 com.jme3.renderer.queue.RenderQueue.renderGeometryList(Lcom/jme3/renderer/queue/GeometryList;Lcom/jme3/renderer/RenderManager;Lcom/jme3/renderer/Camera;Z)V (77 bytes) @ 0x02e0bff0 [0x02e0bf80+0x70]
j  com.jme3.renderer.queue.RenderQueue.renderQueue(Lcom/jme3/renderer/queue/RenderQueue$Bucket;Lcom/jme3/renderer/RenderManager;Lcom/jme3/renderer/Camera;Z)V+68
j  com.jme3.renderer.RenderManager.renderViewPortQueues(Lcom/jme3/renderer/ViewPort;Z)V+45
j  com.jme3.renderer.RenderManager.flushQueue(Lcom/jme3/renderer/ViewPort;)V+3
j  com.jme3.renderer.RenderManager.renderViewPort(Lcom/jme3/renderer/ViewPort;F)V+457
j  com.jme3.renderer.RenderManager.render(FZ)V+149
j  com.jme3.app.SimpleApplication.update()V+197
j  com.jme3.system.lwjgl.LwjglWindow.runLoop()V+131
j  com.jme3.system.lwjgl.LwjglWindow.run()V+51
j  java.lang.Thread.run()V+11
v  ~StubRoutines::call_stub

Does Java Minecraft work on your system? Any other lwjgl apps?

…with intel drivers you kind of have to try a bunch of things. First confirm that your GPU supports OpenGL2 or better… then you might have to go to older drivers, chant weird ancient languages, swing a dead cat over your head 13 times at the stroke of midnight under a full moon, etc…

For a successful chip company, they write really bad drivers.

I installed a trial version and it seems to be working, I can move around the environment, jump, see things moving, etc. Here is a screenshot:

It looks like I am at 4.6:

The more successful a company the less it seems they care about writing good stuff.

Intel had an updated driver so I installed it.

Now, I get the crash at a different location:

# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x5fa8d382, pid=11132, tid=0x00001b0c
#
# JRE version: Java(TM) SE Runtime Environment (8.0_351-b10) (build 1.8.0_351-b10)
# Java VM: Java HotSpot(TM) Client VM (25.351-b10 mixed mode windows-x86 )
# Problematic frame:
# C  [ig9icd32.dll+0x4dd382]

Here is the stack trace:

Stack: [0x18520000,0x18570000],  sp=0x1856e968,  free space=314k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [ig9icd32.dll+0x4dd382]
C  [ig9icd32.dll+0x593c85]
C  [ig9icd32.dll+0x5290e8]
C  [ig9icd32.dll+0x52d51e]
C  [ig9icd32.dll+0x590fd9]
C  [ig9icd32.dll+0x591079]
C  [ig9icd32.dll+0x4c97f3]
C  [ig9icd32.dll+0x7ae329]
C  [ig9icd32.dll+0x8b35ba]
C  [ig9icd32.dll+0x58fa48]
C  [ig9icd32.dll+0x5fd713]
C  [ig9icd32.dll+0x5fe9e5]
C  [ig9icd32.dll+0x870af4]
C  [lwjgl_opengl.dll+0xdd61]
J 2464 C1 com.jme3.renderer.lwjgl.LwjglGL.glBufferData(ILjava/nio/FloatBuffer;I)V (11 bytes) @ 0x03057cf4 [0x03057c10+0xe4]
J 2306 C1 com.jme3.renderer.opengl.GLRenderer.updateBufferData(Lcom/jme3/scene/VertexBuffer;)V (312 bytes) @ 0x0302937c [0x03028f60+0x41c]
J 2150 C1 com.jme3.renderer.opengl.GLRenderer.setVertexAttrib(Lcom/jme3/scene/VertexBuffer;Lcom/jme3/scene/VertexBuffer;)V (621 bytes) @ 0x02ff61b0 [0x02ff5ed0+0x2e0]
J 2233 C1 com.jme3.renderer.opengl.GLRenderer.renderMeshDefault(Lcom/jme3/scene/Mesh;II[Lcom/jme3/scene/VertexBuffer;)V (242 bytes) @ 0x03018fc4 [0x03018db0+0x214]
J 2675 C1 com.jme3.renderer.opengl.GLRenderer.renderMesh(Lcom/jme3/scene/Mesh;II[Lcom/jme3/scene/VertexBuffer;)V (149 bytes) @ 0x03098aec [0x03098940+0x1ac]
J 2673 C1 com.jme3.material.logic.DefaultTechniqueDefLogic.renderMeshFromGeometry(Lcom/jme3/renderer/Renderer;Lcom/jme3/scene/Geometry;)V (64 bytes) @ 0x03098430 [0x03098340+0xf0]
J 2642 C1 com.jme3.material.Material.render(Lcom/jme3/scene/Geometry;Lcom/jme3/light/LightList;Lcom/jme3/renderer/RenderManager;)V (130 bytes) @ 0x030904d0 [0x03090310+0x1c0]
J 2635 C1 com.jme3.renderer.RenderManager.renderGeometry(Lcom/jme3/scene/Geometry;)V (241 bytes) @ 0x0308d6f0 [0x0308d480+0x270]
J 2707 C1 com.jme3.renderer.queue.RenderQueue.renderGeometryList(Lcom/jme3/renderer/queue/GeometryList;Lcom/jme3/renderer/RenderManager;Lcom/jme3/renderer/Camera;Z)V (77 bytes) @ 0x030a36f0 [0x030a3680+0x70]
j  com.jme3.renderer.queue.RenderQueue.renderQueue(Lcom/jme3/renderer/queue/RenderQueue$Bucket;Lcom/jme3/renderer/RenderManager;Lcom/jme3/renderer/Camera;Z)V+68
j  com.jme3.renderer.RenderManager.renderViewPortQueues(Lcom/jme3/renderer/ViewPort;Z)V+45
j  com.jme3.renderer.RenderManager.flushQueue(Lcom/jme3/renderer/ViewPort;)V+3
j  com.jme3.renderer.RenderManager.renderViewPort(Lcom/jme3/renderer/ViewPort;F)V+457
j  com.jme3.renderer.RenderManager.render(FZ)V+149
j  com.jme3.app.SimpleApplication.update()V+197
j  com.jme3.system.lwjgl.LwjglWindow.runLoop()V+131
j  com.jme3.system.lwjgl.LwjglWindow.run()V+51
j  java.lang.Thread.run()V+11
v  ~StubRoutines::call_stub
V  [jvm.dll+0x166894]
V  [jvm.dll+0x2377ab]
V  [jvm.dll+0x167047]
V  [jvm.dll+0x166f86]
V  [jvm.dll+0x101aab]
V  [jvm.dll+0x18b064]
V  [jvm.dll+0x1d04bb]
C  [ucrtbase.dll+0x459d3]
C  [KERNEL32.DLL+0x17d69]
C  [ntdll.dll+0x6b74b]
C  [ntdll.dll+0x6b6cf]
C  0x00000000

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
J 2308  org.lwjgl.opengl.GL15C.nglBufferData(IJJI)V (0 bytes) @ 0x0302a17d [0x0302a120+0x5d]
J 2464 C1 com.jme3.renderer.lwjgl.LwjglGL.glBufferData(ILjava/nio/FloatBuffer;I)V (11 bytes) @ 0x03057cf4 [0x03057c10+0xe4]
J 2306 C1 com.jme3.renderer.opengl.GLRenderer.updateBufferData(Lcom/jme3/scene/VertexBuffer;)V (312 bytes) @ 0x0302937c [0x03028f60+0x41c]
J 2150 C1 com.jme3.renderer.opengl.GLRenderer.setVertexAttrib(Lcom/jme3/scene/VertexBuffer;Lcom/jme3/scene/VertexBuffer;)V (621 bytes) @ 0x02ff61b0 [0x02ff5ed0+0x2e0]
J 2233 C1 com.jme3.renderer.opengl.GLRenderer.renderMeshDefault(Lcom/jme3/scene/Mesh;II[Lcom/jme3/scene/VertexBuffer;)V (242 bytes) @ 0x03018fc4 [0x03018db0+0x214]
J 2675 C1 com.jme3.renderer.opengl.GLRenderer.renderMesh(Lcom/jme3/scene/Mesh;II[Lcom/jme3/scene/VertexBuffer;)V (149 bytes) @ 0x03098aec [0x03098940+0x1ac]
J 2673 C1 com.jme3.material.logic.DefaultTechniqueDefLogic.renderMeshFromGeometry(Lcom/jme3/renderer/Renderer;Lcom/jme3/scene/Geometry;)V (64 bytes) @ 0x03098430 [0x03098340+0xf0]
J 2642 C1 com.jme3.material.Material.render(Lcom/jme3/scene/Geometry;Lcom/jme3/light/LightList;Lcom/jme3/renderer/RenderManager;)V (130 bytes) @ 0x030904d0 [0x03090310+0x1c0]
J 2635 C1 com.jme3.renderer.RenderManager.renderGeometry(Lcom/jme3/scene/Geometry;)V (241 bytes) @ 0x0308d6f0 [0x0308d480+0x270]
J 2707 C1 com.jme3.renderer.queue.RenderQueue.renderGeometryList(Lcom/jme3/renderer/queue/GeometryList;Lcom/jme3/renderer/RenderManager;Lcom/jme3/renderer/Camera;Z)V (77 bytes) @ 0x030a36f0 [0x030a3680+0x70]
j  com.jme3.renderer.queue.RenderQueue.renderQueue(Lcom/jme3/renderer/queue/RenderQueue$Bucket;Lcom/jme3/renderer/RenderManager;Lcom/jme3/renderer/Camera;Z)V+68
j  com.jme3.renderer.RenderManager.renderViewPortQueues(Lcom/jme3/renderer/ViewPort;Z)V+45
j  com.jme3.renderer.RenderManager.flushQueue(Lcom/jme3/renderer/ViewPort;)V+3
j  com.jme3.renderer.RenderManager.renderViewPort(Lcom/jme3/renderer/ViewPort;F)V+457
j  com.jme3.renderer.RenderManager.render(FZ)V+149
j  com.jme3.app.SimpleApplication.update()V+197
j  com.jme3.system.lwjgl.LwjglWindow.runLoop()V+131
j  com.jme3.system.lwjgl.LwjglWindow.run()V+51
j  java.lang.Thread.run()V+11
v  ~StubRoutines::call_stub

Progress!!! Heheh.

I belive Minecraft use different LWJGL version. Not sure if thats the case, but i belive it might be.

Can you try switch LWJGL version in JME and check if older/newer works?

I have these properties defined in my pom.xml:

  <properties>
    <jme3_group>org.jmonkeyengine</jme3_group>
    <jme3_ver>3.5.2-stable</jme3_ver>
  </properties>

I changed this:

    <dependency>
      <groupId>${jme3_group}</groupId>
      <artifactId>jme3-lwjgl3</artifactId>
      <version>${jme3_ver}</version>
    </dependency>  

To this:

    <dependency>
      <groupId>${jme3_group}</groupId>
      <artifactId>jme3-lwjgl</artifactId>
      <version>${jme3_ver}</version>
    </dependency>  

I still get the error.

So, if Minecraft Java works, but JME does not, what does that mean?
Do I need to try a different 3D modeling framework or am I going to have problems even if I switch to something else?
Do I need to buy a different laptop?

Does a simple “blue cube” style scene work?

Maybe it’s something about your code that is triggering a driver bug.

It does seem related to the complexity of my scene.

I can generate 50 images like this without a crash:

But it crashes every time around image 30 when there are more items in the scene:

Without knowing how you made it, it doesn’t seem particularly large. Is each block a different object or something or do you batch things into a single mesh? Or?

Here is an outline of my code:

public class CubePuzzleGenerator extends SimpleApplication {
  private ArrayList<PuzzleInfo> puzzlesToWrite = new ArrayList<PuzzleInfo>();
  
  public void createSolvableGrid(Vector3f puzzleSize) 
  throws Exception {
    // Create a puzzle in a POI workbook
    ...

    // Create a puzzle info object    
    PuzzleInfo puzzleInfo = new PuzzleInfo(puzzleSize,
        workbook);
    puzzlesToWrite.add(puzzleInfo);
  }
    
  @Override
  public void simpleInitApp() {
    // Set the viewport to have a white background
      
    // Create an app state object to take screenshots
    ssAppState = new ScreenshotAppStateWithCallbacks(
        "C:"+File.separator+"Tmp"+File.separator, 
        "test");
    ssAppState.setIsNumbered(false);
    stateManager.attach(ssAppState);
  }
  
  @Override
  public void simpleUpdate(float tpf) {
    if( puzzlesToWrite.isEmpty() ) {
      stop(true);
      return;
    }
    
    PuzzleInfo puzzle = puzzlesToWrite.remove(0);
    try {
      // Add the numbered boxes
      for( int x=0; x<puzzle.getPuzzleSize().getX(); x++ ) {
        for( int y=0; y<puzzle.getPuzzleSize().getY(); y++ ) {
          for( int z=0; z<puzzle.getPuzzleSize().getZ(); z++ ) {
            Cell cell = get the cell for x,y,z;
            Node box = createNumberedBox(puzzle.getWorkbook(),x,y,z,LABEL_FONT,cell);
            box.setLocalTranslation(x*20, -y*20, -z*20);
            rootNode.attachChild(box);
          }
        }
      }
        
      // Add a floor
        
      // Add the axes

      // Set the camera location and rotation
  
      // Take a screenshot
      ssAppState.setFileName(puzzle.getFileName());
      ssAppState.setWriteImageFileCallback(new CallbackToWritePuzzlePdf(this,puzzle));
      ssAppState.takeScreenshot();
  }
  
  /** Create a numbered box at a given position */
  private Node createNumberedBox(Workbook workbook, int x, int y, int z, BitmapFont font, Cell cell) {
    // Create a node to hold the box
    Node node = new Node("Box");
    
    // Add the background
    Mesh m = new Box(10, 10, 10);
    Geometry geom = new Geometry("Box", m);
    Material mat = new Material(assetManager,"Common/MatDefs/Misc/Unshaded.j3md");
    ColorRGBA color = ColorRGBA.White;
    mat.setColor("Color", color);      
    geom.setMaterial(mat);
    node.attachChild(geom);
    
    // Add the outline
    m = new WireBox(10, 10, 10);
    geom = new Geometry("WireBox", m);
    mat = new Material(assetManager,"Common/MatDefs/Misc/Unshaded.j3md");
    mat.getAdditionalRenderState().setLineWidth(2);
    color = ColorRGBA.Black;
    mat.setColor("Color", color);
    geom.setMaterial(mat);
    node.attachChild(geom);
    
    // Add the labels

    // Return the node
    return node;
  }
  
  public void reset() {
    ssAppState.setWriteImageFileCallback(null);
    rootNode.detachAllChildren();
  }
  
  public static void main(String[] args) 
  throws Exception {
    // Create a generator

    // Create some puzzles
    for( int i=0; i<50; i++)
        // Create a solvable grid
        generator.createSolvableGrid(new Vector3f(5,5,5));       
    
    // Run the JME app to create the puzzle images
    AppSettings appSettings = new AppSettings(true);
    appSettings.setHeight(CUBE_IMAGE_SIZE);
    appSettings.setWidth(CUBE_IMAGE_SIZE);
    generator.setSettings(appSettings);
    generator.start(JmeContext.Type.OffscreenSurface);
  }
}
public class CallbackToWritePuzzlePdf implements Runnable {
  CubePuzzleGenerator generator;
  PuzzleInfo puzzle;

  // Constructor

  @Override
  public void run() {
    // Right now, my code only prints a line to the log, nothing else
    
    // Clear the generator
    generator.reset();
    
  }
}

The PuzzleInfo is just a container object to hold information on the puzzle, like size and the workbook of its contents.

1 Like

So I guess that could be a lot of geometry. 5x5x5x2

…but nothing of the level that would normally cause a problem on its own.

Seems like you could avoid adding any of the internal boxes and save 4x4x4x2 cubes which might let you push the issue off until later.

2 Likes

Do you run out of FPS on this test ? What are the number of vertices and objects that can be produced from this last scene in case it runs ?

I am not doing anything which cares about FPS. The render is using an Offscreen Surface and there is no UI. As a test, I added a one second delay at the start of my simpleUpdate() method and that did not change the behavior. Based on that, I don’t think frame rate is a factor.

I will restructure my code to be more conservative on the number of objects I create.

Well, certainly error is related to something in the Code.

Most probably i guess its related to Screenshot AppState usage/code.

Objects should not be a problem, the less the better, thats all.

Do you mean there is an error in my code?
It seems like the error is in Intel’s driver code.

If you think it’s my code, I can pare it down to a test case.

That is my guess, also.

There might be a way to work around the bug by changing your code but that doesn’t mean that your code is wrong.